C#'ta isteğe bağlı parametreleri nasıl kullanabilirsiniz?

Not: Bu soru, C#'ın henüz isteğe bağlı parametreleri desteklemediği bir zamanda (yani C# 4'ten önce) sorulmuştur.

Bir C# sınıfından programlı olarak oluşturulan bir web API'si oluşturuyoruz. Sınıfın GetFooBar(int a, int b) yöntemi var ve APInin&a=foo &b=bargibi sorgu parametrelerini alan birGetFooBar` yöntemi var.

Sınıfların, C# dilinde desteklenmeyen isteğe bağlı parametreleri desteklemesi gerekir. En iyi yaklaşım nedir?

C#'ta normalde yöntemin birden fazla formunu kullanırdım:

void GetFooBar(int a) { int defaultBValue;  GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
 // whatever here
}

GÜNCELLEME: Yukarıda bahsedilen, C# 2.0 ile varsayılan değerleri yaptığım yoldu. Şu anda üzerinde çalıştığım projeler, artık isteğe bağlı parametreleri doğrudan destekleyen C# 4.0 kullanıyor. İşte kendi kodumda kullandığım bir örnek:

public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, 
                                   EDIVanInfo receiver, 
                                   EDIDocumentInfo info,
                                   EDIDocumentType type 
                                     = new EDIDocumentType(EDIDocTypes.X12_814),
                                   bool Production = false)
{
   // My code is here
}
Yorumlar (2)

Bu siteden:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# [Optional] niteliğinin kullanımına izin verir (C#'ta işlevsel olmasa da VB'den). Yani şöyle bir yönteminiz olabilir:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

API sarmalayıcımızda, isteğe bağlı parametreleri tespit ediyoruz (ParameterInfo p.IsOptional) ve varsayılan bir değer ayarlıyoruz. Amaç, parametre adında "optional" olması gibi kludge'lara başvurmadan parametreleri isteğe bağlı olarak işaretlemektir.

Yorumlar (4)

Metot aşırı yüklemesini kullanabilirsin...

GetFooBar()
GetFooBar(int a)
GetFooBar(int a, int b)

Yöntem imzalarına bağlıdır, verdiğim örnekte sadece "int b" yöntemi eksiktir çünkü "int a" yöntemi ile aynı imzaya sahip olacaktır.

Nullable türleri kullanabilirsiniz...

GetFooBar(int? a, int? b)

Daha sonra a.HasValue kullanarak bir parametrenin ayarlanıp ayarlanmadığını kontrol edebilirsiniz.

Başka bir seçenek de bir 'params' parametresi kullanmak olabilir.

GetFooBar(params object[] args)

Adlandırılmış parametreler kullanmak isterseniz, bunları işlemek için bir tür oluşturmanız gerekecektir, ancak web uygulamaları için zaten böyle bir şey olduğunu düşünüyorum.

Yorumlar (0)