Указание свойств при инициализации - PullRequest
1 голос
/ 29 марта 2010
void Foo()
{

string ID = "test";
var testctrl = new Control() {ID = (ID**!=null?ID**:ID)};

}

Можно ли получить значение идентификатора ** в приведенном выше коде? Проблема в том, что они оба имеют одинаковые имена свойств.

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

Ответы [ 5 ]

1 голос
/ 29 марта 2010

Если вы хотите проверить, является ли новый идентификатор элемента управления нулевым, вам следует сделать это.

void Foo()
{
    string ID = "test";
    var testctrl = new Control();
    if(testctrl.ID==null)
        testctrl.ID = ID;
}
1 голос
/ 29 марта 2010

Первое замечание об этой строке выглядит странно (присваивая строку bool):

bool ID = "test";

Второе замечание, это прекрасно работает:

string ID = "test";
var testctrl = new Control(){ ID = (ID==null?ID:ID) };

Третье замечание: в C # принято именовать локальные переменные, начиная со строчной буквы.

1 голос
/ 29 марта 2010

Если не учитывать, что код не может быть скомпилирован ... Первая ID (ID=) в этом синтаксисе относится к назначению, в частности к назначаемому члену. С правой стороны все сводится к стандартному разрешению. Который никогда означает ID нового объекта. Сначала он будет смотреть на локальную переменную ID, затем после этого члены (поля и т. Д.) Текущего экземпляра. Чтобы предпочли членов в текущем экземпляре, используйте this.ID.

Возможно, вы также захотите рассмотреть объединяющий нуль оператор, поэтому, если вы имеете в виду «локальную переменную или экземпляр-член, если он имеет значение null, это будет ID ?? this.ID - но еще лучше будет создавать однозначные имена переменных; -p

0 голосов
/ 29 марта 2010

Видя твой пример, я подозреваю, что у тебя нет требования, чтобы идентификатор был уникальным? В целом, чтобы избежать неприятных проблем, подобных этой, не пытайтесь использовать повторяющиеся имена свойств, но, возможно, вы связаны с существующим интерфейсом.

Как насчет добавления перегрузки конструктора, которая принимает «внешний» идентификатор в качестве параметра?

void Foo()
{

string ID = "test";
var testctrl = new Control(ID);

}

В общем, я думаю, что если свойство делает больше, чем просто присваивание (проверка аргументов в данном случае), вы должны делать это в «наборе» самого свойства, а не во время «инициализации объекта».

0 голосов
/ 29 марта 2010

Вопрос мне не так понятен, но вы хотите этого:

void Foo()
{

bool ID = "test";
var testctrl = new Control(){ID = (this.ID==null?ID:this.ID)};

}

примечание, не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...