#c# #properties
#c# #свойства
Вопрос:
Я имею в виду документацию Microsoft — https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties . Они утверждают, что автоматически реализованные свойства — это в основном свойства без тела, когда внутри get или set не требуется дополнительная логика. так int Myproperty1 {get;set;}
и автоматически реализованное свойство. В этой документации также указаны следующие пункты
Утверждение 1: «Вы не можете объявлять автоматически реализованные свойства в интерфейсах. Автоматически реализованные свойства объявляют частное резервное поле экземпляра, а интерфейсы могут не объявлять поля экземпляра. «
Но я могу объявить автоматически реализованное свойство, как показано ниже, в интерфейсе
public MyInterface { int Myproperty1 {get;set;}
. Разве это не противоречит приведенному выше утверждению о том, что мы не можем объявлять автоматически реализованные свойства в интерфейсе.
Затем в документации Microsoft говорится: statement2: «Объявление свойства в интерфейсе без определения тела объявляет свойство с средствами доступа, которые должны быть реализованы каждым типом, реализующим этот интерфейс».
Я не понимаю, что объявляет свойство без тела, не является ли оно автоматически реализованным свойством, если это так, то является ли первое утверждение неверным?
ВАЖНОЕ РЕДАКТИРОВАНИЕ ВОПРОСА: прошу прощения, я по ошибке разместил вопрос по этой ссылке: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties. Хотя я намеревался сослаться на следующую ссылку: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties. Теперь я обновил свой вопрос правильной ссылкой.
Комментарии:
1. Все автоматические свойства не имеют тел, но не все свойства без тел являются автоматическими свойствами. Ни одно из утверждений не является ложным.
2.
Is this not conflicting above statement that we cant declare auto implemented properties in Interface.
Нет, это не так. Это может сбить с толку , пока вы не поймете, что один и тот же{ get; set; }
синтаксис означает разные вещи в интерфейсе и классе. В интерфейсе это означает «реализующий класс должен реализовать это» (т.е."Declaring a property in an interface without defining a body declares a property with accessors that must be implemented by each type that implements that interface."
). В классе это означает «автоматически реализованное свойство» (с полем поддержки частного экземпляра).3.
But i can declare auto implemented property like below in an interface
Нет, вы не можете. Это выглядит (для вас) как свойство auto. Но это не так (по определению — поскольку интерфейсы не могут иметь автоматических свойств).
Ответ №1:
MSDN никогда не говорил ничего подобного «все свойства без тел являются автоматически реализованными свойствами». Они могут сказать, что «автоматически реализованные свойства не имеют тел», но последнее не подразумевает первое. MSDN не противоречит самому себе.
Свойства без тел в интерфейсе abstract
, в то время как автоматически реализуемые свойства — это те, которые не являются абстрактными, без тел и в классе / структуре.
Следовательно, MyProperty1
in public MyInterface { int MyProperty1 {get;set;} }
— это не автоматически реализуемое свойство, а абстрактное.
Я не понимаю, что такое объявление свойства без тела
Это все равно что объявлять два метода без тел в интерфейсе:
public MyInterfaceWithTwoMethods {
int GetMyProperty1();
void SetMyProperty1(int value);
}
За исключением того, что использование свойств в C # более идиоматично.
Вы могли бы реализовать MyInterface
с помощью автоматически реализованного свойства:
public class MyImpl : MyInterface {
public int MyProperty1 { get; set; }
}
Несмотря на то, что вы, кажется, просто повторяете то , что написано MyInterface
, это аналогично реализации MyInterfaceWithTwoMethods
, подобной этой:
public class MyImpl : MyInterfaceWithTwoMethods {
private int myProperty1;
int GetMyProperty1() => myProperty1;
void SetMyProperty1(int value) { myProperty1 = value; }
}
Вы также можете реализовать MyInterface
not с помощью автоматически реализованного свойства:
public class MyImpl : MyInterface {
public int MyProperty1 {
get => 1;
set { Console.WriteLine("foo"); }
}
}
Комментарии:
1. Спасибо всем, кто потратил время и усилия на этот вопрос. На основе ответов до сих пор я понимаю, что не каждое свойство без тела является автоматически реализованным свойством. В основном это зависит от того, в каком контексте оно определено. Если он находится внутри класса, то он автоматически реализован, но в контексте интерфейса это не автоматически реализованное свойство.
2. Независимо от того, верна документация или нет, мое мнение таково, что она очень плохо написана. Выражение «Объявление свойства в интерфейсе без определения тела», когда это единственный вариант, который у вас есть, без тела, должно быть переписано, чтобы яснее показать, что они говорят о значении объявления, а не о том, что происходит, когда вы его объявляете.
3. @LasseV.Karlsen я согласен, что его можно переписать лучше. OTOH, возможно, из-за моих предварительных знаний / предвзятости, я нахожу документацию понятной такой, какая она есть.