Подтвердить что ты не робот

Как узнать значение по умолчанию?

Рассмотрим такой метод:

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() в этом контексте.

4b9b3361

Ответ 1

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

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

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

    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 как @lc. объяснил, что на самом деле нет причин для этого, так как вы можете использовать перегрузки методов.

Ответ 2

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

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

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() без заданного параметра не делает лексического смысла. Можно было бы ожидать значения после слова at. Возможно, вы захотите переименовать второй метод WorkAtDefaultLocation().

Ответ 3

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

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
}

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

Ответ 4

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

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

Ответ 5

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

Метод 1:

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

Способ 2. Использование функции Overload

//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)

Ответ 6

Если вы используете 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;
    }
}

Ответ 7

Измените значение по умолчанию на null и измените его на @ "home"