Adlandırılmış ve İsteğe Bağlı Bağımsız Değişkenler (C# Programlama Kılavuzu)

Adlandırılmış bağımsız değişkenler , bağımsız değişkeni parametre listesindeki konumuyla değil adıyla eşleştirerek parametre için bir bağımsız değişken belirtmenizi sağlar. İsteğe bağlı bağımsız değişkenler , bazı parametreler için bağımsız değişkenleri atlamanızı sağlar. Her iki teknik de yöntemler, dizin oluşturucular, oluşturucular ve temsilcilerle kullanılabilir.

Adlandırılmış ve isteğe bağlı bağımsız değişkenler kullandığınızda, bağımsız değişkenler parametre listesinde değil, bağımsız değişken listesinde göründükleri sırayla değerlendirilir.

Adlandırılmış ve isteğe bağlı parametreler, seçili parametreler için bağımsız değişkenler sağlamanıza olanak tanır. Bu özellik, Microsoft Office Otomasyonu API'leri gibi COM arabirimlerine yapılan çağrıları büyük ölçüde kolaylaştırır.

Adlandırılmış bağımsız değişkenler

Adlandırılmış bağımsız değişkenler, bağımsız değişkenlerin sırasını, çağrılan yöntemlerin parametre listelerindeki parametrelerin sırasıyla eşleştirmenizi engeller. Her parametrenin bağımsız değişkeni parametre adına göre belirtilebilir. Örneğin, sipariş ayrıntılarını (satıcı adı, sipariş numarası ve ürün adı gibi) yazdıran bir işlev, bağımsız değişkenleri işlev tarafından tanımlanan sırayla konuma göre göndererek çağrılabilir.

PrintOrderDetails("Gift Shop", 31, "Red Mug");

Parametrelerin sırasını anımsamıyor ancak adlarını biliyorsanız, bağımsız değişkenleri herhangi bir sırada gönderebilirsiniz.

PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

Adlandırılmış bağımsız değişkenler, her bağımsız değişkenin neyi temsil ettiği belirlenerek kodunuzun okunabilirliğini de geliştirir. Aşağıdaki örnek yöntemde sellerName null veya boşluk olamaz. Hem hem de sellerNameproductName dize türleri olarak, bağımsız değişkenleri konuma göre göndermek yerine, ikisini birbirinden ayırıp kodu okuyan herkesin karışıklığını azaltmak için adlandırılmış bağımsız değişkenleri kullanmak mantıklıdır.

Adlandırılmış bağımsız değişkenler, konumsal bağımsız değişkenlerle kullanıldığında, geçerli olduğu sürece

  • herhangi bir konumsal bağımsız değişken tarafından izlenmiyor veya

    PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");
    
  • doğru konumda kullanılır. Aşağıdaki örnekte parametresi orderNum doğru konumdadır ancak açıkça adlandırılmıyor.

    PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug");
    

Sıra dışı adlandırılmış bağımsız değişkenleri izleyen konumsal bağımsız değişkenler geçersizdir.

// This generates CS1738: Named argument specifications must appear after all fixed arguments have been specified.
PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");

Örnek

Aşağıdaki kod, bu bölümdeki örneklerin yanı sıra bazı ek örnekleri de uygular.

class NamedExample
{
    static void Main(string[] args)
    {
        // The method can be called in the normal way, by using positional arguments.
        PrintOrderDetails("Gift Shop", 31, "Red Mug");

        // Named arguments can be supplied for the parameters in any order.
        PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
        PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

        // Named arguments mixed with positional arguments are valid
        // as long as they are used in their correct position.
        PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");
        PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug"); 
        PrintOrderDetails("Gift Shop", orderNum: 31, "Red Mug");

        // However, mixed arguments are invalid if used out-of-order.
        // The following statements will cause a compiler error.
        // PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");
        // PrintOrderDetails(31, sellerName: "Gift Shop", "Red Mug");
        // PrintOrderDetails(31, "Red Mug", sellerName: "Gift Shop");
    }

    static void PrintOrderDetails(string sellerName, int orderNum, string productName)
    {
        if (string.IsNullOrWhiteSpace(sellerName))
        {
            throw new ArgumentException(message: "Seller name cannot be null or empty.", paramName: nameof(sellerName));
        }

        Console.WriteLine($"Seller: {sellerName}, Order #: {orderNum}, Product: {productName}");
    }
}

İsteğe bağlı bağımsız değişkenler

Bir yöntemin, oluşturucunun, dizin oluşturucunun veya temsilcinin tanımı, parametrelerinin gerekli veya isteğe bağlı olduğunu belirtebilir. Herhangi bir çağrı tüm gerekli parametreler için bağımsız değişkenler sağlamalıdır, ancak isteğe bağlı parametreler için bağımsız değişkenleri atlayabilir.

İsteğe bağlı her parametrenin tanımının bir parçası olarak varsayılan bir değeri vardır. Bu parametre için bağımsız değişken gönderilmezse, varsayılan değer kullanılır. Varsayılan değer aşağıdaki ifade türlerinden biri olmalıdır:

  • sabit ifade;
  • formun new ValType()ifadesi; burada ValType sabit listesi veya yapı gibi bir değer türüdür;
  • bir değer türü olan ValType default(ValType) form ifadesidir.

İsteğe bağlı parametreler, gerekli parametrelerden sonra parametre listesinin sonunda tanımlanır. Çağıran, isteğe bağlı parametrelerin ardıllarından herhangi biri için bir bağımsız değişken sağlıyorsa, önceki tüm isteğe bağlı parametreler için bağımsız değişkenler sağlamalıdır. Bağımsız değişken listesindeki virgülle ayrılmış boşluklar desteklenmez. Örneğin, aşağıdaki kodda örnek yöntemi ExampleMethod bir gerekli ve iki isteğe bağlı parametreyle tanımlanır.

public void ExampleMethod(int required, string optionalstr = "default string",
    int optionalint = 10)

Aşağıdaki çağrısı ExampleMethod , üçüncü parametre için bağımsız değişken sağlandığından ancak ikinci parametre için sağlanmadığından derleyici hatasına neden olur.

//anExample.ExampleMethod(3, ,4);

Ancak, üçüncü parametrenin adını biliyorsanız, görevi gerçekleştirmek için adlandırılmış bir bağımsız değişken kullanabilirsiniz.

anExample.ExampleMethod(3, optionalint: 4);

IntelliSense, aşağıdaki çizimde gösterildiği gibi isteğe bağlı parametreleri belirtmek için köşeli ayraç kullanır:

ExampleMethod yöntemi için IntelliSense hızlı bilgilerini gösteren ekran görüntüsü.

Not

.NET OptionalAttribute sınıfını kullanarak isteğe bağlı parametreler de bildirebilirsiniz. OptionalAttribute parametreleri için varsayılan değer gerekmez. Ancak, varsayılan bir değer istenirse sınıfına göz DefaultParameterValueAttribute atın.

Örnek

Aşağıdaki örnekte oluşturucusunun ExampleClass isteğe bağlı olan bir parametresi vardır. Örnek yönteminin ExampleMethod bir gerekli parametresirequired, ve iki isteğe bağlı parametresi vardıroptionalstr.optionalint içindeki Main kod, oluşturucunun ve yöntemin çağrılabileceği farklı yolları gösterir.

namespace OptionalNamespace
{
    class OptionalExample
    {
        static void Main(string[] args)
        {
            // Instance anExample does not send an argument for the constructor's
            // optional parameter.
            ExampleClass anExample = new ExampleClass();
            anExample.ExampleMethod(1, "One", 1);
            anExample.ExampleMethod(2, "Two");
            anExample.ExampleMethod(3);

            // Instance anotherExample sends an argument for the constructor's
            // optional parameter.
            ExampleClass anotherExample = new ExampleClass("Provided name");
            anotherExample.ExampleMethod(1, "One", 1);
            anotherExample.ExampleMethod(2, "Two");
            anotherExample.ExampleMethod(3);

            // The following statements produce compiler errors.

            // An argument must be supplied for the first parameter, and it
            // must be an integer.
            //anExample.ExampleMethod("One", 1);
            //anExample.ExampleMethod();

            // You cannot leave a gap in the provided arguments.
            //anExample.ExampleMethod(3, ,4);
            //anExample.ExampleMethod(3, 4);

            // You can use a named parameter to make the previous
            // statement work.
            anExample.ExampleMethod(3, optionalint: 4);
        }
    }

    class ExampleClass
    {
        private string _name;

        // Because the parameter for the constructor, name, has a default
        // value assigned to it, it is optional.
        public ExampleClass(string name = "Default name")
        {
            _name = name;
        }

        // The first parameter, required, has no default value assigned
        // to it. Therefore, it is not optional. Both optionalstr and
        // optionalint have default values assigned to them. They are optional.
        public void ExampleMethod(int required, string optionalstr = "default string",
            int optionalint = 10)
        {
            Console.WriteLine(
                $"{_name}: {required}, {optionalstr}, and {optionalint}.");
        }
    }

    // The output from this example is the following:
    // Default name: 1, One, and 1.
    // Default name: 2, Two, and 10.
    // Default name: 3, default string, and 10.
    // Provided name: 1, One, and 1.
    // Provided name: 2, Two, and 10.
    // Provided name: 3, default string, and 10.
    // Default name: 3, default string, and 4.
}

Yukarıdaki kod, isteğe bağlı parametrelerin doğru uygulanmadığı bir dizi örnek gösterir. birincisi, gerekli olan ilk parametre için bir bağımsız değişkenin sağlanması gerektiğini gösterir.

Arayan bilgisi öznitelikleri

Çağıran hakkında bir yönteme bilgi almak için , , ve CallerArgumentExpressionAttributegibi CallerFilePathAttributeçağıran bilgi öznitelikleri kullanılır. CallerMemberNameAttributeCallerLineNumberAttribute Bu öznitelikler özellikle hata ayıklarken veya yöntem çağrılarıyla ilgili bilgileri günlüğe kaydetmeniz gerektiğinde kullanışlıdır.

Bu öznitelikler, derleyici tarafından sağlanan varsayılan değerlere sahip isteğe bağlı parametrelerdir. Çağıran, bu parametreler için açıkça bir değer sağlamamalıdır.

COM arabirimleri

Adlandırılmış ve isteğe bağlı bağımsız değişkenler, dinamik nesneler desteğinin yanı sıra Office Otomasyonu API'leri gibi COM API'leriyle birlikte çalışabilirliği büyük ölçüde geliştirir.

Örneğin, AutoFormat Microsoft Office Excel Range arabirimindeki yöntemin yedi parametresi vardır ve bunların tümü isteğe bağlıdır. Bu parametreler aşağıdaki çizimde gösterilmiştir:

Otomatik Biçim yöntemi için IntelliSense hızlı bilgilerini gösteren ekran görüntüsü.

Ancak, adlandırılmış ve isteğe bağlı bağımsız değişkenler kullanarak çağrısı AutoFormat büyük ölçüde basitleştirebilirsiniz. Adlandırılmış ve isteğe bağlı bağımsız değişkenler, parametrenin varsayılan değerini değiştirmek istemiyorsanız isteğe bağlı bir parametrenin bağımsız değişkenini atlamanızı sağlar. Aşağıdaki çağrıda yedi parametreden yalnızca biri için bir değer belirtilir.

var excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;

var myFormat =
    Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;

excelApp.Range["A1", "B4"].AutoFormat( Format: myFormat );

Daha fazla bilgi ve örnek için bkz . Office programlamasında adlandırılmış ve isteğe bağlı bağımsız değişkenleri kullanma ve C# özelliklerini kullanarak Office birlikte çalışma nesnelerine erişme.

Aşırı yükleme çözümü

Adlandırılmış ve isteğe bağlı bağımsız değişkenlerin kullanılması aşırı yükleme çözümlemesini aşağıdaki yollarla etkiler:

  • Yöntem, dizin oluşturucu veya oluşturucu, parametrelerinin her biri isteğe bağlıysa veya ada veya konuma göre çağıran deyimdeki tek bir bağımsız değişkene karşılık geliyorsa yürütme adayıdır ve bu bağımsız değişken parametre türüne dönüştürülebilir.
  • Birden fazla aday bulunursa, açıkça belirtilen bağımsız değişkenlere tercih edilen dönüştürmeler için aşırı yükleme çözümleme kuralları uygulanır. İsteğe bağlı parametreler için atlanan bağımsız değişkenler yoksayılır.
  • İki aday eşit derecede iyi olarak değerlendirilirse tercih, çağrıda bağımsız değişkenlerin atlandığı isteğe bağlı parametreleri olmayan bir adaya gider. Aşırı yükleme çözümlemesi genellikle daha az parametreye sahip adayları tercih eder.

C# dili belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.