2015-08-24 3 views
24

Рассмотрим метод, как это:Как узнать значение по умолчанию?

public void WorkAt(string location = @"home") 
{ 
    //... 
} 

Это можно назвать, передавая значение в явном виде:

WorkAt(@"company"); 
WorkAt(@"home"); 

Или просто использовать значение по умолчанию, как:

WorkAt(); 

Есть ли способ узнать, используется ли значение по умолчанию?

Например, я хочу, чтобы закодировать так:

public void WorkAt(string location = @"home") 
{ 
    if (/* the default value is used unexplicitly */) 
    { 
     // Do something 
    } 
    else 
    { 
     // Do another thing 
    } 
} 

Будьте осторожны, что WorkAt("home") отличается от WorkAt() в этом контексте.

+1

Что о 'если (место ==«дом») {}' –

+1

вы уже определили его. почему бы не проверить 'if (location == @" home ")' ??? – Sherlock

+1

Почему вы не используете дополнительный параметр boolUseDefault? –

ответ

9

Вы можете использовать ReferenceEquals для этой цели.

Однако строка, которую вы отправляете, не должна быть константой времени компиляции, иначе строка "home" имеет ту же ссылку со значением по умолчанию "home" и вернет true. Why?

Чтобы создать строку с другой ссылкой, вы должны сделать глубокую копию этой строки.

static void Main() 
    { 
     WorkAt(); // Prints true 
     WorkAt("home"); // Prints true because the string is a compile-time constant 

     // DeepClone before passing parameter to WorkAt. 
     WorkAt(DeepClone("home"));// Prints false for any string. 
    } 

    static void WorkAt(string location = @"home") 
    { 
     if (ReferenceEquals(location, @"home")) // Only true when using default parameter 
     { 
      Console.WriteLine(true); 
     } 
     else 
     { 
      Console.WriteLine(false); 
     } 
    } 

    static string DeepClone(string str) // Create a deep copy 
    { 
     return new string(str.ToCharArray()); 
    } 

Обратите внимание, что это единственный способ понять, используется ли значение по умолчанию. потому что значение по умолчанию всегда является константой времени компиляции, но параметр, отправленный методу, отсутствует.

BTW as @lc. объяснил, что на самом деле нет причин для этого, так как вы можете использовать перегрузки методов.

2

Как программист, значение по умолчанию является известное значение, так что вы можете закодировать, как и любой из следующих методов:

Метод 1:

public void WorkAt(string location = @"home") 
{ 
    if (location == @"home") 
    { 
     // Do something 
    } 
    else 
    { 
     // Do another thing 
    } 
} 

Способ 2: Используйте функция Over загрузки

//function(A) with default value 
public static void samplemethod() 
    { 
     string defaultValue="home"; 
     //Do something 
    } 

//function (B) without default value 
public static void samplemethod(string x) 
    { 
     //Do something 
    } 

Тогда samplemethod("someValue"); будем называть function(B) и samplemethod(); будет звонить по телефону function(A)

+0

Я думаю, ему это не нужно .. Он сказал .. По умолчанию 'home' отличается от' home', переданного как параметр. –

67

Для этого нет и не должно быть никаких причин. Значение по умолчанию должно делать именно это - предоставить значение по умолчанию, если ни один не указан.

Если вам нужно выполнить другую функцию, основанную на переданном, я предлагаю перегрузить метод. Например:

public void WorkAt() 
{ 
    //do something 
} 

public void WorkAt(string location) 
{ 
    //do other thing 
} 

В качестве альтернативы, если есть общая логика, вы могли бы использовать дополнительный параметр:

public void WorkAt(string location = "home", bool doOtherThingInstead = false) 
{ 
    if (!doOtherThingInstead) 
    { 
     //do something 
    } 
    else 
    { 
     //do other thing 
    } 

    //do some shared logic for location, regardless of doOtherThingInstead 
} 

Как примечание стороны, возможно, например, в вопросе был надуманным, но WorkAt() с не параметр не делает лексического смысла. Можно было бы ожидать значение после слова по адресу. Возможно, вы захотите переименовать второй метод WorkAtDefaultLocation().

+13

Теперь OP придет, спрашивая, как явно найти 'doOtherThingInstead = false'? : P –

+22

@SriramSakthivel В этом случае мне придется рекурсивно ссылаться на этот ответ. Хм, я думаю, что у нас только что было переполнение стека на Stack Overflow. :-P –

+1

_There нет, _ на самом деле его возможно. [взгляните на мой ответ] (http://stackoverflow.com/a/32176490/4767498). –

2

Если вы используете OO, вы можете просто создать свойство GetSet.

private string pvt_default; 
private string pvt_location; 
public string location 
{ 
    get 
    { 
     return this.pvt_location; 
    } 
    set 
    { 
     if (pvt_default == location) 
     { 
      // do somthing 
     } 
     this.pvt_location = location; 
    } 
} 
+0

Что это даже касается вопроса !? –

+0

IMHO WorkAt может использоваться как свойство его класса вместо методов. Тогда он мог бы также получить награды. –

+1

Лично я не согласен (но не собираюсь спускать вниз), так как изменение там, где вы работаете, может потребовать усилий (транспорт и т. Д.). Просто не кажется правильным использовать геттеры/сеттеры на _actions_. –

10

Ваш ответ может быть примерно следующим кодом.

public void CommonOperations(/*Some parameteres as needed.*/) 
{ 
    // Shared operations between two methods. 
} 
public void WorkAt() 
{ 
    string location = "home"; 
    CommonOperations(/*Some parameteres as needed.*/); 
    //do something 
} 

public void WorkAt(string location) 
{ 
    CommonOperations(/*Some parameteres as needed.*/); 
    //do the other thing 
} 

Надеюсь, это поможет.

7

Используйте значение дозорного вместо стандартного

public void WorkAt(location="default_sentinel_value") { 
    if (location == "default_sentinel_value") { 
     location = "home"; 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 
+0

Но тогда, если кто-то передаст часового ('WorkAt (" default_sentinel_value ")'). Он сказал, как он может обнаружить разницу между «WorkAt()» и «WorkAt (« home »)»? Вы не можете без перегрузок функций. –

+0

он может обнаружить разницу между WorkAt() и WorkAt («home»), но не между WorkAt() и WorkAt («дозор»). Разумеется, значение дозорного устройства не должно быть одним из значимых значений. – Leonhard

+3

Если 'null' не является допустимым значением для функции, вы можете использовать значение null в качестве контрольного значения. – Falco

2

Изменение значения по умолчанию обнулить и изменить его на @ «дома»

Смежные вопросы