Я изучаю ASP.NET MVC и могу читать документы на английском, но я не совсем понимаю, что происходит в этом коде:
public class Genre
{
public string Name { get; set; }
}
Что это значит: { get; set; }
{ get; set; }
{ get; set; }
?
Я изучаю ASP.NET MVC и могу читать документы на английском, но я не совсем понимаю, что происходит в этом коде:
public class Genre
{
public string Name { get; set; }
}
Что это значит: { get; set; }
{ get; set; }
{ get; set; }
?
Это так называемое автоматическое свойство и по существу является сокращением для следующего (аналогичный код будет сгенерирован компилятором):
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
Так как я понимаю { get; set; }
{ get; set; }
{ get; set; }
является "автоматическим свойством", которое, как сказали @Klaus и @Brandon, является сокращением для написания свойства с "вспомогательным полем". Итак, в этом случае:
public class Genre
{
private string name; // This is the backing field
public string Name // This is your property
{
get => name;
set => name = value;
}
}
Однако, если вы похожи на меня - примерно час назад - вы не совсем понимаете, что такое свойства и средства доступа, и у вас нет лучшего понимания некоторых основных терминов. MSDN - отличный инструмент для изучения подобных вещей, но его не всегда легко понять новичкам. Поэтому я попытаюсь объяснить это более подробно здесь.
get
и set
являются аксессорами, то есть они могут получать доступ к данным и информации в приватных полях (обычно из вспомогательного поля) и обычно делают это из открытых свойств (как вы можете видеть в приведенном выше примере).
Нельзя отрицать, что приведенное выше утверждение довольно запутанно, поэтому давайте рассмотрим несколько примеров. Допустим, этот код относится к жанрам музыки. Так что в классе Жанр мы будем хотеть разные жанры музыки. Допустим, мы хотим иметь 3 жанра: хип-хоп, рок и кантри. Чтобы сделать это, мы будем использовать имя класса для создания новых экземпляров этого класса.
Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
//called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();
//Note the () following new Genre. I believe that essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it there but I do know it essential)
Теперь, когда мы создали экземпляры класса Genre, мы можем установить названия жанров, используя свойство 'Name', которое было установлено выше.
public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now
Мы можем установить имя 'g1' на хип-хоп, написав следующее
g1.Name = "Hip Hop";
То, что здесь происходит, довольно сложно. Как я уже говорил, get
и set
информацию о доступе из личных полей, к которым у вас не было бы доступа. get
может только читать информацию из этого частного поля и возвращать ее. set
может записывать информацию только в это личное поле. Но, имея свойство get
и set
мы можем выполнять обе эти функции. И написав g1.Name = "Hip Hop";
мы специально используем функцию set
из нашего свойства Name
set
использует неявную переменную с именем value
. По сути, это означает, что каждый раз, когда вы видите "значение" в set
, оно ссылается на переменную; переменная "значение". Когда мы пишем g1.Name =
мы используем =
для передачи переменной value
которая в данном случае является "Hip Hop"
. Таким образом, вы можете по существу думать об этом так:
public class g1 //We've created an instance of the Genre Class called "g1"
{
private string name;
public string Name
{
get => name;
set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because
//'value' in 'g1' was set to "Hip Hop" by previously
//writing 'g1.Name = "Hip Hop"'
}
}
Важно отметить, что приведенный выше пример на самом деле не написан в коде. Это скорее гипотетический код, который представляет то, что происходит в фоновом режиме.
Итак, теперь, когда мы установили имя экземпляра жанра g1, я думаю, что мы можем получить имя, написав
console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property
//and returns the field 'name' which we just set to
//"Hip Hop"
и если мы запустим это, мы получим "Hip Hop"
в нашей консоли.
Таким образом, для целей этого объяснения я также дополню пример выводами.
using System;
public class Genre
{
public string Name { get; set; }
}
public class MainClass
{
public static void Main()
{
Genre g1 = new Genre();
Genre g2 = new Genre();
Genre g3 = new Genre();
g1.Name = "Hip Hop";
g2.Name = "Rock";
g3.Name = "Country";
Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
}
}
Выход:
"Genres: Hip Hop, Rock, Country"
В основном, другой способ написания свойства с помощью вспомогательного поля.
public class Genre
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
Это короткий способ сделать это:
public class Genre
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
Это ярлык, позволяющий публиковать данные как общедоступные, так что вам не нужно явно создавать личные данные. С# создаст для вас частный элемент данных.
Вы могли бы просто сделать ваши члены данных общедоступными, не используя этот ярлык, но если вы решили изменить реализацию элемента данных, чтобы иметь некоторую логику, тогда вам нужно будет сломать интерфейс. Короче говоря, это ярлык для создания более гибкого кода.
В основном это ярлык:
class Genre{
private string genre;
public string getGenre() {
return this.genre;
}
public void setGenre(string theGenre) {
this.genre = theGenre;
}
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female
Свойство автоматически реализованное свойство для С#.
Они являются аксессуарами для имени публичной собственности.
Вы использовали бы их для получения/установки значения этого свойства в экземпляре жанра.
Это автоматически реализованное свойство. Это в основном сокращенный способ создания свойств для класса в С# без необходимости определения для них частных переменных. Обычно они используются, когда не требуется никакой дополнительной логики при получении или установке значения переменной.
Вы можете прочитать больше в Руководстве по программированию автоматически реализуемых свойств MSDN.
Это означает, что если вы создадите переменную типа Genre, вы сможете получить доступ к переменной как к свойству
Genre oG = new Genre();
oG.Name = "Test";
Шаблон get/set предоставляет структуру, которая позволяет добавлять логику во время настройки ('set') или retrieve ('get') экземпляра свойства экземплярированного класса, что может быть полезно, когда некоторые для свойства требуется эталонная логика.
Свойство может иметь только "get" accessor, который делается для того, чтобы сделать это свойство только для чтения
При реализации шаблона get/set промежуточная переменная используется как контейнер, в который может быть помещено значение, и извлеченное значение. Промежуточная переменная обычно имеет префикс с подчеркиванием. эта промежуточная переменная является частной, чтобы обеспечить доступ к ней только через вызовы get/set. См. Ответ от Brandon, поскольку его ответ демонстрирует наиболее часто используемые соглашения синтаксиса для реализации get/set.
Такой синтаксис { get; set; }
называется автоматическим свойством, синтаксис С# 3.0
Для компиляции необходимо использовать Visual С# 2008/csc v3.5 или выше. Но вы можете скомпилировать выходные данные с минимальными значениями, такими как .NET Framework 2.0 (не требуется время выполнения или классы, необходимые для поддержки этой функции).
В Visual Studio, если вы определяете свойство X
в классе и хотите использовать этот класс только как тип, после создания вашего проекта вы получите предупреждение, в котором говорится: "Поле X никогда не назначается, и всегда будет иметь значение по умолчанию".
Добавив свойство { get; set; }
в X
, вы не получите это предупреждение.
Кроме того, в Visual Studio 2013 и в верхних версиях, добавив { get; set; }
, вы можете увидеть все ссылки на это свойство.
Get set - это модификаторы доступа к свойству. Get читает поле свойства. Set устанавливает значение свойства. Получить - это доступ только для чтения. Набор подобен доступу, доступному только для записи. Чтобы использовать свойство как прочитанное, нужно использовать как get, так и set.
Функция Get вызывается, когда свойство отображается справа (RHS). Набор вызывается, когда свойство отображается слева (LHS) символа '='.
Для автоматически реализуемого свойства поле поддержки работает за сценой и не отображается.
Пример:
public string Log { get; set; }
Принимая во внимание, что для нереализованного свойства вспомогательное поле является открытым, видимым как частная переменная области действия.
Пример:
private string log;
public string Log
{
get => log;
set => log = value;
}
Кроме того, стоит отметить, что "получатель" и "установщик" могут использовать разные "вспомогательные поля"
Это в основном сокращение. Вы можете написать public string Name { get; set; }
public string Name { get; set; }
public string Name { get; set; }
как во многих примерах, но вы также можете написать это:
private string _name;
public string Name
{
get { return _name; }
set { _name = value ; } // value is a special keyword here
}
Почему это используется? Его можно использовать для фильтрации доступа к свойству, например, вы не хотите, чтобы имена включали числа.
Позволь мне привести пример:
private class Person {
private int _age; // Person._age = 25; will throw an error
public int Age{
get { return _age; } // example: Console.WriteLine(Person.Age);
set {
if ( value >= 0) {
_age = value; } // valid example: Person.Age = 25;
}
}
}
Официально он называется "Автоматически реализованные свойства" и имеет хорошую привычку читать (руководство по программированию). Я также рекомендовал бы обучающее видео С# Properties: зачем использовать "get" и "set".
Если вы хотите установить свойство, используйте этот код:
public string Name
{
get
{
if (validacao)
return "Name Last Name";
else
return "Name";
}
}