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

public string Method(p1, p2, p3)
{
    this.p1 = p1;
    this.p2 = p2;
    this.p3 = p3;
}

Любые идеи?

10
Schotime 3 Фев 2009 в 13:27
Вы думаете об этом сокращенном синтаксисе из C ++? stackoverflow.com/questions/1711990/…
 – 
Frucifer
23 Апр 2018 в 23:51

3 ответа

Лучший ответ

Возможно, вы думаете о синтаксисе инициализатора нового объекта в C # 3.0. Это выглядит так:

var foo = new Foo { Bar = 1, Fizz = "hello" };

Таким образом, мы получаем новый экземпляр Foo со свойством «Bar», инициализированным значением 1, и свойством «Fizz» значением «hello».

Уловка с этим синтаксисом заключается в том, что если вы опустите «=» и предоставите идентификатор, он будет предполагать, что вы назначаете свойство с тем же именем. Так, например, если бы у меня уже был экземпляр Foo, я мог бы сделать это:

var foo2 = new Foo { foo1.Bar, foo1.Fizz };

Это очень похоже на ваш пример. Если ваш класс имеет свойства p1, p2 и p3 и у вас есть переменные с тем же именем, вы можете написать:

var foo = new Foo { p1, p2, p3 };

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

29
Matt Hamilton 3 Фев 2009 в 13:32
Ты мог бы быть прав, Мэтт, хотя я не уверен. ха-ха. действительно нужно спасти эти вещи, когда я найду их в следующий раз. ваше здоровье.
 – 
Schotime
3 Фев 2009 в 13:38

Возможно, вы думаете об «инициализаторе объекта» в C #, где вы можете создать объект, задав свойства класса, а не используя параметризованный конструктор.

Я не уверен, что это можно использовать в вашем примере, поскольку ваше "this" уже создано.

3
Andy White 3 Фев 2009 в 13:31
Есть ли что-то похожее в Java?
 – 
Verhogen
15 Окт 2009 в 22:26

В C # 7 есть еще более простой способ сделать это - конструкторы с выражением.

Используя приведенный выше пример, ваш конструктор можно упростить до одной строки кода. Я включил поля класса для полноты, полагаю, они все равно будут в вашем классе.

private string _p1;
private int _p2;
private bool _p3;  

public Method(string p1, int p2, bool p3) => (_p1, _p2, _p3) = (p1, p2, p3);

См. Следующую ссылку для получения дополнительной информации: -

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members

10
grimdog_john 28 Май 2019 в 14:04