Sdílet prostřednictvím


ref (Referenční dokumentace jazyka C#)

ref Klíčové slovo způsobí, že argument mají být předány ve formě odkazu, nikoliv hodnotou.Účinek předání odkazem je, že jakékoli změny do parametru volané metody se v volání metody.Například pokud volající předá místní proměnné výraz nebo výraz pole elementu přístup a volané metody nahradí objekt, na kterou odkazuje parametr ref, pak místní proměnné volajícího nebo elementem pole nyní odkazovat na nový objekt.

[!POZNÁMKA]

Nelze zaměňovat pojem předání odkazem s koncept odkazové typy.Dvě koncepce nejsou stejné.Parametr metody mohou být změněny pomocí ref bez ohledu na to, zda je typ hodnoty nebo typ odkazu.Když je předána odkazem neexistuje žádné zabalení typu hodnoty.

Chcete-li použít ref parametr, definice metody a volání metody je nutné explicitně zadat ref klíčové slovo, jak je znázorněno v následujícím příkladu.

class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int. 
            // The following statement would cause a compiler error if i 
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

Argument, který je předán ref parametr musí být inicializován předtím, než je předán.Tím se liší od out parametry, jejichž argumenty není nutné explicitně inicializovat předtím, než jsou předávány.Další informace naleznete v tématu si.

Členy třídy nemůže mít podpisů, které se liší pouze ref a out.Dojde k chybě kompilátoru, pokud jediným rozdílem mezi dvěma členy typu je, že jeden z nich má ref má parametr a druhý out parametru.Například následující kód není zkompilovat.

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded  
    // methods that differ only on ref and out". 
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

Však přetížení lze provést Pokud má jedna metoda ref nebo out parametr a druhá má hodnotu parametru, jak je znázorněno v následujícím příkladu.

class RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }

V jiných situacích, které vyžadují podpis odpovídající, jako je například zobrazení nebo skrytí přepsání ref a out jsou součástí podpisu a vzájemně si neodpovídají.

Vlastnosti nejsou proměnné.Jsou metody a nemůže být předán ref parametry.

Informace o tom, jak předat pole naleznete v tématu Předávání polí pomocí parametrů ref a out (Průvodce programováním v C#).

Nelze použít ref a out klíčová slova pro následující typy metod:

  • Asynchronní metody, které můžete definovat pomocí asynchronní modifikátor.

  • Iterační metody, které patří přinést return nebo yield break prohlášení.

Příklad

Předchozí příklady ukazují, co se stane, když předáte hodnotu typy odkazem.Můžete také použít ref klíčové slovo k předání odkazové typy.Předání typu odkazu odkazem umožňuje volané metody k nahrazení objektu v metodě volajícího, na kterou odkazuje parametru odkazu.Umístění úložiště objektu je předaný metodě jako hodnotu parametru odkazu.Pokud změníte hodnotu v umístění úložiště parametru (tak, aby odkazovalo na nový objekt), můžete také změnit umístění úložiště, na kterou odkazuje volajícího.Následující příklad předá instanci typu odkaz jako ref parametru.Další informace o tom, jak předat odkazové typy hodnotou tak odkazem, naleznete v části Předávání parametrů typu odkazu (Průvodce programováním v C#).

class RefExample2
{
    static void ChangeByReference(ref Product itemRef)
    {
        // The following line changes the address that is stored in   
        // parameter itemRef. Because itemRef is a ref parameter, the 
        // address that is stored in variable item in Main also is changed.
        itemRef = new Product("Stapler", 99999);

        // You can change the value of one of the properties of 
        // itemRef. The change happens to item in Main as well.
        itemRef.ItemID = 12345;
    }

    static void Main()
    {
        // Declare an instance of Product and display its initial values.
        Product item = new Product("Fasteners", 54321);
        System.Console.WriteLine("Original values in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);

        // Send item to ChangeByReference as a ref argument.
        ChangeByReference(ref item);
        System.Console.WriteLine("Back in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);
    }
}

class Product
{
    public Product(string name, int newID)
    {
        ItemName = name;
        ItemID = newID;
    }

    public string ItemName { get; set; }
    public int ItemID { get; set; }
}

// Output:  
//Original values in Main.  Name: Fasteners, ID: 54321 

//Back in Main.  Name: Stapler, ID: 12345

Specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Předávání parametrů (Průvodce programováním v C#)

Parametry metody (Referenční dokumentace jazyka C#)

Klíčová slova jazyka C#

Koncepty

Průvodce programováním v C#

Další zdroje

Referenční dokumentace jazyka C#