Подтвердить что ты не робот

Ищете короткий и простой пример геттеров/сеттеров в С#

Мне сложно понять концепцию getters и seters на языке С#. В таких языках, как Objective-C, они кажутся неотъемлемой частью системы, но не так много в С# (насколько я могу судить). Я уже читал книги и статьи, поэтому мой вопрос касается тех из вас, кто понимает геттеры и сеттеры в С#, какой пример вы бы использовали лично, если бы вы преподавали концепцию совершенно новичку (это будет включать в себя несколько строк кода насколько возможно)?

4b9b3361

Ответ 1

Я думаю, что немного кода поможет проиллюстрировать, что сеттеры и геттеры:

public class Foo
{
   private string bar;

   public string GetBar()
   {
       return bar;
   }

   public void SetBar(string value)
   {
       bar = value;
   }
}

В этом примере у нас есть частный член класса, который называется bar. Методы GetBar и SetBar выполняют то, что они назвали, - один извлекает член бара, а другой устанавливает его значение.

В С# 1.1 + у вас есть свойства. Базовая функциональность также одинаков:

public class Foo
{
    private string bar;

    public string Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}

Частная панель элементов недоступна вне класса. Однако публичная "Бар" есть, и у нее есть два accessors - get, которые так же, как пример выше "GetBar()" возвращает частный член, а также набор, который соответствует методу SetBar (строковое значение) в предыдущем пример.

Начиная с С# 3.0 и выше, компилятор стал оптимизирован до такой степени, что для таких свойств не обязательно иметь частный член в качестве источника. Компилятор автоматически генерирует частный член этого типа и использует его как источник свойства.

public class Foo
{
   public string Bar { get; set; }
}

то, что показывает код, является автоматическим свойством, у которого есть частный член, сгенерированный компилятором. Вы не видите частного участника, но он есть. Это также ввело пару других проблем - в основном с контролем доступа. В С# 1.1 и 2.0 вы можете опустить get или set часть свойства:

public class Foo
{
    private string bar;

    public string Bar
    {
        get{ return bar; }
    }
}

Предоставление вам возможности ограничить взаимодействие других объектов с свойством "Бар" класса Foo. Начиная с С# 3.0 и выше - если вы решили использовать автоматические свойства, вам нужно будет указать доступ к свойству следующим образом:

public class Foo
{
    public string Bar { get; private set; }
}

Это означает, что только сам класс может установить Bar на какое-то значение, однако любой может прочитать значение в Bar.

Ответ 2

В С#, Свойства представляют ваши Getters и Setters.

Вот пример:

public class PropertyExample
{
    private int myIntField = 0;

    public int MyInt
    {
        // This is your getter.
        // it uses the accessibility of the property (public)
        get
        {
            return myIntField;
        }
        // this is your setter
        // Note: you can specifiy different accessibility
        // for your getter and setter.
        protected set
        {
            // You can put logic into your getters and setters
            // since they actually map to functions behind the scenes
            DoSomeValidation(value)
            {
                // The input of the setter is always called "value"
                // and is of the same type as your property definition
                myIntField = value;
            }
        }
    }
}

Вы получите доступ к этому свойству, как к полю. Например:

PropertyExample example = new PropertyExample();
example.MyInt = 4; // sets myIntField to 4
Console.WriteLine( example.MyInt ); // prints 4

Несколько замечаний: 1) Вам не нужно указывать как получателя, так и сеттера, вы можете опустить один из них.

2) Свойства - это просто "синтаксический сахар" для вашего традиционного геттера и сеттера. Компилятор фактически построит функции get_ и set_ за кулисами (в скомпилированном IL) и сопоставляет все ссылки на ваше свойство на эти функции.

Ответ 3

Большинство языков делают это так, и вы тоже можете делать это на С#.

    public void setRAM(int RAM)
    {
        this.RAM = RAM;
    }
    public int getRAM()
    {
        return this.RAM;
    }

Но С# также дает более элегантное решение для этого:

    public class Computer
    {
        int ram;
        public int RAM 
        { 
             get 
             {
                  return ram;
             }
             set 
             {
                  ram = value; // value is a reserved word and it is a variable that holds the input that is given to ram ( like in the example below )
             }
        }
     }

И позже получите доступ к нему.

    Computer comp = new Computer();
    comp.RAM = 1024;
    int var = comp.RAM;

Для более новых версий С# это даже лучше:

public class Computer
{
    public int RAM { get; set; }
}

и позже:

Computer comp = new Computer();
comp.RAM = 1024;
int var = comp.RAM;

Ответ 4

С# вводит свойства, которые делают большую часть тяжелого подъема для вас...

т

public string Name { get; set; }

- это ярлык С# для записи...

private string _name;

public string getName { return _name; }
public void setName(string value) { _name = value; }

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

т

private string _name;

public string getName { return _name; }
public void setName(string value) 
{ 
    //Don't want things setting my Name to null
    if (value == null) 
    {
        throw new InvalidInputException(); 
    }
    _name = value; 
}

Ответ 5

Мое объяснение будет следующим. (Это не так коротко, но это довольно просто.)


Представьте себе класс с переменной:

class Something
{
    int weight;
    // and other methods, of course, not shown here
}

Ну, есть небольшая проблема с этим классом: никто не может видеть weight. Мы могли бы сделать weight общедоступным, но тогда каждый сможет изменить weight в любой момент (что, возможно, не то, что мы хотим). Итак, хорошо, мы можем сделать функцию:

class Something
{
    int weight;
    public int GetWeight() { return weight; }
    // and other methods
}

Это уже лучше, но теперь каждому вместо простого something.Weight нужно набрать something.GetWeight(), что, ну, уродливо.

Со свойствами мы можем сделать то же самое, но код остается чистым:

class Something
{
    public int weight { get; private set; }
    // and other methods
}

int w = something.weight // works!
something.weight = x; // doesn't even compile

Приятно, поэтому со свойствами мы имеем более тонкое управление доступом к переменной.

Еще одна проблема: хорошо, мы хотим, чтобы внешний код мог установить weight, но мы хотели бы контролировать его значение и не допускать веса ниже 100. Кроме того, существует некоторая другая внутренняя переменная density, который зависит от weight, поэтому мы хотели бы пересчитать density, как только изменится weight.

Это традиционно достигается следующим образом:

class Something
{
    int weight;
    public int SetWeight(int w)
    {
        if (w > 100)
            throw new ArgumentException("weight too small");
        weight = w;
        RecalculateDensity();
    }
    // and other methods
}

something.SetWeight(anotherSomething.GetWeight() + 1);

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

class Something
{
    private int _w;
    public int Weight
    {
        get { return _w; }
        set
        {
            if (value > 100)
                throw new ArgumentException("weight too small");
            _w = value;
            RecalculateDensity();
        }
    }
    // and other methods
}

something.Weight = otherSomething.Weight + 1; // much cleaner, right?

Таким образом, без сомнения, свойства являются "просто" синтаксическим сахаром. Но это делает клиентский код лучше. Интересно, что потребность в подобных свойствах возникает очень часто, вы можете проверить, как часто вы находите такие функции, как GetXXX() и SetXXX() на других языках.

Ответ 6

Простой пример

    public  class Simple
    {
        public int Propery { get; set; }
    }

Ответ 7

Насколько я понимаю, геттеры и сеттеры должны улучшить инкапсуляцию. В С# нет ничего сложного.

Вы определяете свойство объекта on следующим образом:

int m_colorValue = 0;
public int Color 
{
   set { m_colorValue = value; }
   get { return m_colorValue; }
}

Это самое простое использование. Он в основном устанавливает внутреннюю переменную или получает ее значение. Вы используете свойство, подобное этому:

someObject.Color = 222; // sets a color 222
int color = someObject.Color // gets the color of the object

В конечном итоге вы можете обработать значение в сеттерах или геттерах следующим образом:

public int Color 
{
   set { m_colorValue = value + 5; }
   get { return m_colorValue  - 30; }
}

Если вы пропустите set или get, ваше свойство будет считано или записано. Вот как я понимаю материал.

Ответ 8

Ну вот общее использование геттера в реальном использовании,

public class OrderItem 
{
public int Id {get;set;}
public int quantity {get;set;}
public int Price {get;set;}
public int TotalAmount {get {return this.quantity *this.Price};set;}
}

Ответ 10

Внутренне, геттеры и сеттеры - это просто методы. Когда С# компилируется, он генерирует методы для ваших геттеров и сеттеров, например:

public int get_MyProperty() { ... }
public void set_MyProperty(int value) { ... }

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

public int MyProperty { get; set; }

или

private int myProperty;
public int MyProperty 
{ 
    get { return myProperty; }
    set { myProperty = value; } // value is an implicit parameter containing the value being assigned to the property.
}

Ответ 11

Getters and Setters в С# - это то, что упрощает код.

private string name = "spots";

public string Name
{
    get { return name; }
    set { name = value; }
}

И называя его (предположим, что у нас есть объект obj с свойством name):

Console.WriteLine(Person.Name); //prints "spots"
Person.Name = "stops";
Console.Writeline(Person.Name); //prints "stops"

Это упрощает ваш код. Где в Java вам может потребоваться два метода: один для Get() и один для Set() свойства, в С# все это делается в одном месте. Обычно я делаю это в начале моих занятий:

public string foobar {get; set;}

Это создает getter и setter для моего свойства foobar. Вызвать это так же, как показано выше. Следует отметить, что вам не нужно включать оба метода get и set. Если вы не хотите, чтобы свойство было изменено, не включайте set!

Ответ 12

Это базовый пример объекта "Статья" с геттерами и сеттерами:

  public class Article
    {

        public String title;
        public String link;
        public String description;

        public string getTitle()
        {
            return title;
        }

        public void setTitle(string value)
        {
            title = value;
        }

        public string getLink()
        {
            return link;
        }

        public void setLink(string value)
        {
            link = value;
        }
        public string getDescription()
        {
            return description;
        }

        public void setDescription(string value)
        {
            description = value;
        }
    }