2015-03-17 1 views
2

Спасибо заранее, ребята. Я совершенно новичок в кодировании, поэтому, пожалуйста, будьте терпеливы. Ниже приведен фрагмент кода, над которым я работаю. Ниже приведен полный код. Это выглядит следующим образом:Невозможно определить, как называется аксессуар свойства, используя ключевое слово «this»

using System; 

public class Product 
{ 

    private string name; 
    private decimal price; 


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

    public decimal Price 
    { 
     get 
     { return price; } 
     set 
     { price = value; } 
    } 



    public Product(string name, decimal price) 
    { 

     this.name = name; 
     this.price = price; 
    } 
} 

В способе загрузки страницы, объект экземпляра и конструктор вызывается следующим образом:

private void Page_Load(object sender, EventArgs e) 

    { 

     Product saleProduct = new Product("Kitchen Garbage", 49.99M); 

    } 

Когда продукт создан, конструктор инициализируется с вышеназванными значения. Теперь, если вы посмотрите в конструкторе, у вас есть:

this.name = name; 

и

this.price = price; 

После двух вышеуказанных строк кода выполняются, то аксессоров свойство автоматически назначать закрытые переменные («имя» и " цена ") с предполагаемыми значениями.

Так как же линия:

this.name = name; 

и

this.price = price; 

способен вызвать общественные аксессор, названные "Имя" и "Цена"?

я видел только тогда, когда общественный аксессор явно называют такие как:

saleProduct.Name = "Kitchen Garbage"; 

Я не понимаю, как:

this.name = name; 

и

this.price = price; 

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

saleProduct.Name = "Kitchen Garbage"; 

Можете ли вы помочь и объяснить, как

this.name = name; 

и

this.price = price; 

имеет доступ к открытой собственности? Даже название свойств, то есть «Имя» и «Цена», заменяется на «Кухонный мусор» и «49.99» соответственно, когда выполняются вышеуказанные две строки кода.

Кроме того, как делает

this.name = name; 

и

this.price = price; 

знаю какой государственный аксессор позвонить?

Я искал всюду для объяснения, но не повезло.

спасибо.

+0

«Я искал всюду» сомнительно: [это (ссылка на C#)] (https://msdn.microsoft.com/en-us/library/dk1507sz.aspx) – Plutonix

+0

они не вызывают открытый аксессор. – Claies

ответ

1

this.name относится к private string name;. Это личное, поэтому только код внутри класса может ссылаться на него.

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

У публичного доступа public string Name нет собственного хранилища. Он переходит в частное поле name.

Код this.name = name; не касается имущества Name - это наоборот.

Когда вы делаете this.name = name;, вы устанавливаете значение частного поля с именем name.

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

Посмотрите на определение собственности:

get { return name; } 

Обратите внимание, что здесь, name относится к той же области, как this.name. Вы можете изменить его на this.name, и эффект не будет. Здесь просто не требуется, так как нет никакой двусмысленности.

0

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

FYI Я считаю, что принято считать, что лучше всего использовать элементы уровня класса с верхней буквой (или подчеркиванием иногда в случае членов/полей поддержки?), А также переменными уровня и параметрами уровня с нижней буквой. (Не цитируйте меня на этом пункте: P)

так, чтобы установить поле через это сеттер просто сделать:

public class Foo 
{ 
    private string _bar; 
    public string Bar 
    { 
     set 
     { 
      this._bar = value; 
     }  
     get 
     { 
      return _bar; 
     } 
    } 

    public Foo(string bar) 
    { 
     this.Bar = bar; 
    } 
} 

vs.

public Foo(string bar) 
{ 
    this._bar = bar 
} 

выше эквивалентно тому, что вы в вашем коде. Обратите внимание, что ваша текущая реализация не действительно имеет значение, так как у вас нет дополнительной логики в вашем сеттере. Если бы вы это сделали, в своей реализации вы пропустили бы эту дополнительную логику. Заметьте, я немного изменил переменные, чтобы сделать его более очевидным, что делается.

, чтобы продемонстрировать, что точка считают это:

public class Foo 

    private string _bar; 
    public string Bar 
    { 
     set 
     { 
      this._bar = value + " blah blah"; 
     }  
     get 
     { 
      return _bar; 
     } 
    } 

    public Foo() 
    { 
     this.Bar = "test"; 
     Console.WriteLine(Bar); // outputs "test blah blah" 

     this._bar = "test"; 
     Console.WriteLine(Bar); // outputs "test" 
    } 
} 
3

Частные члены name и price доступны во всех нестатических методов в классе Product. Поскольку конструктор для Product является частью класса, члены также доступны там.

Ваш конструктор не использует общедоступные свойства Name и Price. Они извлекают свои значения из соответствующих частных членов.

+1

@FredBurnett, потому что 'Name' вытаскивает из' name', когда вы устанавливаете 'name' =" whatever ",' Name' теперь возвращает значение «whatever» – Kritner

+0

Хорошо, я понимаю. Спасибо. Но одно, когда я просматриваю код с помощью debug, как только строка, this.name = name; , свойство «Name» также принимает новое значение, присвоенное «name». Поэтому, если вы сказали, что конструктор не использует общедоступные свойства Name и Price, то почему их значения также меняются на значения, указанные в конструкторе, и почему это свойство «Имя» и «Цена» затронуты? Извините, если этот вопрос является основным. – Fred

+0

Спасибо, Брендан, очень ценим. – Fred

0
this.name = name; 

и

this.price = price; 

используются в конструкторе для класса продукта. Частные члены доступны из конструктора (а также из любого нестатического метода в классе).

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

Публичные свойства Название и цена, как это реализовано здесь, являются обертками вокруг этих частных имен и переменных цены и позволяют вам делать другие вещи при настройке или выборке (представьте, что хотите посчитать количество раз, на которое ссылается значение : вы можете увеличить счетчик в get {} публичного свойства).

+0

Спасибо Крису. Я понимаю это. В моем коде, когда я использую debug для выполнения кода, когда я выполняю строку, this.name = name; Свойство «Имя» также изменяется на то же значение, что и this.name. Я немного смущен относительно того, как this.name = name; автоматически изменяет значение свойства «Имя», поскольку нет очевидного соединения. – Fred

+0

Правильно, это потому, что Имя определено, чтобы просто вернуть this.name в ваш метод get {}. Подумайте о методах get {} и set {} для имени публичного свойства как только методов объекта ... поскольку get {} для Name определен как просто возвращающий this.name, любая модификация this.name в этом объекте будет изменяет то, что возвращает метод get {}. Надеюсь это поможет. –

+0

Большое спасибо за объяснение этого Криса. Очень ценится. – Fred

0

Нижняя обсаженная name и price являются частными переменными «поддержки» для публичных Name и Price переменных. Доступ к ним можно получить только из самого класса. Причина использования this.price заключается в том, что метод принимает параметр под названием «цена», поэтому вам нужно указать, что вы устанавливаете поле классов и не назначаете локальную переменную. Вы часто видите это в конструкторах, лично я бы решил назвать аргументы чем-то иным, чем поля в моем классе, и тогда это было бы необязательно.

Смежные вопросы