свойства c# с повторным кодом

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

5
задан Craig.Nicol 15 September 2008 в 15:15
поделиться

10 ответов

Нет. Не пишущий значительно больше (тайный?) код, чем исходная версия (необходимо было бы использовать отражение для проверки на атрибут на свойстве и что нет.. я упоминал это являющийся 'медленнее').. Это - вид дублирования, с которым я могу жить.

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

set
{ 
  _name = value; 
  NotifyPropertyChanged("Name"); 
}

Если бы это было возможно, то я полагал бы, что у тех умных парней в MS уже было бы что-то как этот на месте..

5
ответ дан 18 December 2019 в 14:54
поделиться

Нет, при использовании автоматических свойств, Вы не имеете никакого контроля над реализацией. Наилучший вариант состоит в том, чтобы использовать инструмент шаблонной обработки, фрагменты кода или создать частный SetValue<T> (касательно T backingField, T значение), который инкапсулирует логику метода set.

private void SetValue<T>(ref T backingField, T value)
{
   if (backingField != value)
   {
      backingField = value;
      IsDirty = true;
   }
}

public string Name
{
   get
   {
      return _name;
   }
   set
   {
      SetValue(ref _name, value);
   }
}
2
ответ дан 18 December 2019 в 14:54
поделиться

Другая альтернатива могла бы быть генератором кода, таким как codesmith для автоматизации создания свойств. Это было бы особенно полезно, если свойства, которые Вы создаете, являются столбцами в таблице базы данных

0
ответ дан 18 December 2019 в 14:54
поделиться

Вы могли попытаться настроить фрагмент кода, чтобы помочь создать их.

3
ответ дан 18 December 2019 в 14:54
поделиться

Если Вы действительно хотите пойти тем путем, изменить то, что код делает использование атрибута, существуют некоторые способы сделать это, и они все связаны с AOP (Аспектно-ориентированное программирование). Проверьте PostSharp, который является aftercompiler, который может изменить Ваш код в после шага компиляции. Например, Вы могли настроить один пользовательский атрибут для своих свойств (или аспект, как это называют в AOP), который вводит код в методах set свойства, который отмечает Ваши объекты как грязные. Если Вы хотите некоторые примеры того, как это достигается, можно проверить их учебные руководства.

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

Существует больше платформ AOP там некоторая компиляция сообщения использования и некоторые механизмы перехвата метода использования, которые присутствуют в .NET, позже имеют некоторые недостатки производительности по сравнению с первым.

3
ответ дан 18 December 2019 в 14:54
поделиться

Я могу рекомендовать пользоваться Библиотекой Предприятия с этой целью. Блок приложений политики поставляет инфраструктуру, чтобы сделать "что-то" (что-то =, можно кодировать это самостоятельно) каждый раз, когда Вы вводите/выходите метод, например. Можно управлять поведением с атрибутами. Возьмите это в качестве подсказки движение в деталь с документацией библиотеки предприятия.

0
ответ дан 18 December 2019 в 14:54
поделиться

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

Необходимо было бы использовать Отражение для идентификации изменений свойства - который не является на самом деле настолько дорогим, если Вы не делаете многое из него!

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

0
ответ дан 18 December 2019 в 14:54
поделиться

Я сказал бы, что лучший способ решить это состоит в том, чтобы использовать Аспектно-ориентированное программирование (AOP). Mats Helander привел в порядок запись на этом на InfoQ. Статья немного грязна, но возможно следовать. Существует много различных продуктов, который делает AOP в пространстве.NET, я рекомендую PostSharp.

0
ответ дан 18 December 2019 в 14:54
поделиться

Объект ContextBound. При создании класса, который расширяет контекстно-зависимый объект, и Вы создаете ContextAttribute, можно прервать вызовы, выполненные к такому свойству и устанавливать.NET IsDirty., создаст прокси к классу, таким образом, все вызовы пробегаются через что-то как приемник дистанционной работы.

Проблема с таким подходом, хотя то, что Ваш прокси будет только вызван при внешнем вызове. Я дам Вам пример.

class A
{
    [Foo]
    public int Property1{get; set;}
    public int Property2{get {return variable;} set{ Property1 = value; variable = value; }
}

Когда property1 называют от другого класса, Ваш прокси был бы вызван. Но если другой класс называет property2, даже при том, что набор property2 будет звонить в property1, никакой прокси не будет вызван, (прокси не необходимо, когда Вы находитесь в самом классе).

Существует много примера кода там использования ContextBoundObjects, изучите его.

0
ответ дан 18 December 2019 в 14:54
поделиться

Если Вы действительно идете с Атрибутами, я вполне уверен, что Вы будете иметь к логике самокрутки для выведения то, что они имеют в виду и что сделать о них. То, независимо от того, что использует Ваши пользовательские объекты класса, должно будет иметь способ выполнить эти действия/проверки атрибута, предпочтительно при инстанцировании.

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

0
ответ дан 18 December 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: