Value c что это

от admin

Name already in use

docs / docs / csharp / language-reference / keywords / value.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

value (C# Reference)

The contextual keyword value is used in the set accessor in property and indexer declarations. It is similar to an input parameter of a method. The word value references the value that client code is attempting to assign to the property or indexer. In the following example, MyDerivedClass has a property called Name that uses the value parameter to assign a new string to the backing field name . From the point of view of client code, the operation is written as a simple assignment.

For more information, see the Properties and Indexers articles.

C# language specification

Footer

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Свойства в C#: назначение, использование, примеры

В статье поговорим о свойствах полей класса ( c# get set ). Разберемся с определением и назначением этой структуры, а также рассмотрим примеры внедрения этой концепции в C#-приложения.

Содержание:

Что такое свойство в C#?

Свойство в C# является членом класса, который используется для установки и получения данных из поля данных класса. Самый важный момент, о котором нужно помнить — свойство в C# никогда не используется для хранения данных, оно действует как интерфейс для их передачи. Это своего рода расширение переменных класса, предоставляющее возможность читать, записывать или изменять значения этих переменных, не влияя на внешний способ доступа к ним в приложении.

Оно содержит один или два блока кода, называемых аксессорами, внутри которых находятся методы доступа get и set . Используя эти методы, мы можем изменить внутреннюю реализацию переменных класса в зависимости от наших требований.

Записываются свойства ( property ) так:

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

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

Такая структура данных в С#, подразделяются на три типа:

    Read-Write (для чтения-записи). Так называется свойство, содержащее два блока аксессора.

Также следует помнить, что свойства не принимают никаких параметров, а тип данных свойств должен быть таким же, как у полей, для которых мы его создаем.

Вот простейший пример определения приватной переменной со свойством:

Здесь мы написали свойство «Color» с методами get (для возврата значения) и set (для его переопределения).

Сразу отметим, что в методе get мы либо возвращаем, либо вычисляем, а затем возвращаем значение поля. Но тут важно понимать, что акссесор не используется для изменения состояния объекта! С помощью методов get и set можно лишь расширить поведение переменных:

В примере рассмотрено написание частной переменной fullname и ее свойства Fullname . Их названия одинаковы, если не считать регистра, но это просто стиль написания. В своих примерах вы можете называть их по-разному, их названия могут быть какие угодно. Параметр value служит для определения передаваемого значения.

Таким образом применение концепции свойств дает полный контроль над доступом к полям класса.

Вот как это выглядит:

Здесь мы наделяем наше свойство новым значением с вызовом set , а get сработает когда мы попытаемся прочитать это значение.

Преимущества применения такой концепции

Вы можете задаться вопросом: для чего так необходимы эти свойства? Ведь в подобных ситуациях можно обойтись обыкновенными переменными класса. Вся суть концепции свойств заключается в возможности вкладывания в переменные дополнительной логики.

Например, при присваивании ей другого значения:

Имей переменная years из нашего примера public-доступ — у разработчика появилась бы возможность присвоить ей извне другое значение, что не всегда хорошо (подобные вещи чаще всего происходят в результате ошибки или случайности). В таких ситуациях нам и необходимы свойства , ограничивающие к ней доступ.

А еще, применяя свойства, мы:

    получаем универсальный инструмент для работы с полями и их доступностью извне;

Read-Write

Рассмотрим пример реализации класса Exmpl с одним целочисленным полем, используемым в качестве хранилища для свойства Numb , обеспечивающего реализацию стандартных методов-аксессоров.

Выведет:5

Влияние модификаторов доступности свойств на переменные

Для использования нашего свойства необходимо объявить его открытым (public). Иначе нам не удастся получить к нему доступ и результатом будет ошибка компилятора. Также можно использовать модификаторы отдельно во внутренних блоках свойства.

Однако тут мы должны помнить о ряде существующих ограничений:

  1. Установка модификатора в блоках аксессоров возможна, когда у свойства есть оба блока.
  2. Только одному из двух блоков можно написать модификатор — не двум сразу
  3. Модификаторы внутренних блоков должны иметь более жесткое ограничение доступности, в отличие от модификатора самого свойства. Например, при открытом свойстве (public) его внутренние блоки могут быть: protected , private , internal , protected internal .

Свойства и массив double

Рассмотрим пример по реализации свойства double-массива. Объявим:

  • поле X — числовой массив
  • несколько конструкторов класса;
  • индексатор, возвращающий нужные нам члены массива по порядковому номеру;
  • свойство Summ

Выведет:
summ = 10
test = 1

В Summary get вычисляет сумму всех членов массива, а set — раздает им значение.

Создание свойства Read-only

Мы рассмотрели ранее, что свойство с одним методом get принадлежит типу read-only . Приведем пример создания такого рода свойств:

Здесь мы применили только один метод доступа — get , сделав тем самым наше свойство доступным только для чтения. Раскомментировав закомментированный код, мы получим ошибку компиляции из-за отсутствия возможности установить новое значение при помощи set .

Запустив нашу программу, мы получим следующий результат:

Name: Sheldon Cooper
Loc: Pasadena

Создание свойства write-only

Здесь, наоборот, мы применили только один метод — set , сделав свойство Write-only . А раскомментировав ранее закомментированный код, мы получим ошибку компиляции из-за отсутствия возможности возврата значения.

Результат программы будет такой же, как и в предыдущем примере.

Автоматически реализуемые свойства

Свойства управляют доступностью переменных класса, и если такая переменная одна — тогда все понятно. Но что если у нас их несколько десятков? Ведь в таком случае писать каждой однотипное свойство — долго и затратно. Для решения такого рода вопросов в C# , а точнее в его фреймворк .NET, был добавлен функционал реализации автоматических свойств. Давайте разберемся, что это такое.

Автоматическим называется свойство, содержащее стандартные методы доступа ( get, set ) без какой-либо логической реализации, например:

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

Структурная переменная и доступ к ней (пример)

Рассмотрим принцип работы связки свойств и структурной переменной типа fraction , реализующей дробь:

Ab = 5
rd = 3
R.nume = 3, R.deno = 1

Рассматривая свойства, надо отметить, что они не добавляют место в памяти для переменных класса, а только контролируют доступ к ним. А также не являются членами данных класса, а переменные определяются независимо от них.

Обзор рассматриваемой концепции

Давайте кратко перечислим наиболее важные моменты, которые необходимо четко понимать при работе со свойствами:

  1. Свойства разработаны для контроля доступности внутренних полей класса
  2. Аксессор get нужен для возврата значения свойства, а set — для переопределения этого значения.
  3. value — ключевое слово в set -аксессоре, используемое для назначения ему значения
  4. C#-свойства делятся на категории:
  • Read-Write (чтение запись) с двумя аксессорами внутри
  • Read only (только для чтения) — отсутствует метод set
  • Write only (только для записи) — отсутствует метод get

Для лучшего восприятия и освоения рассматриваемой концепции предлагаю посмотреть видеоролик по теме:

Свойства

Еще одной разновидностью члена класса является свойство. Как правило, свойство сочетает в себе поле с методами доступа к нему.

Свойства очень похожи на индексаторы. В частности, свойство состоит из имени и аксессоров get и set. Аксессоры служат для получения и установки значения переменной. Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set. Аналогичным образом используются аксессоры get и set индексатора.

Ниже приведена общая форма свойства:

где тип обозначает конкретный тип свойства, например int, а имя — присваиваемое свойству имя. Как только свойство будет определено, любое обращение к свойству по имени приведет к автоматическому вызову соответствующего аксессора. Кроме того, аксессор set принимает неявный параметр value, который содержит значение, присваиваемое свойству.

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

Свойствам присущ ряд существенных ограничений:

Cвойство не определяет место для хранения данных, и поэтому не может быть передано методу в качестве параметра ref или out.

Cвойство не подлежит перегрузке. Наличие двух разных свойств с доступом к одной и той же переменной допускается, но это, скорее, исключение, чем правило.

Cвойство не должно изменять состояние базовой переменной при вызове аксессора get. И хотя это ограничительное правило не соблюдается компилятором, его нарушение считается семантической ошибкой. Действие аксессора get не должно носить характер вмешательства в функционирование переменной.

Автоматически реализуемые свойства

Начиная с версии C# 3.0, появилась возможность для реализации очень простых свойств, не прибегая к явному определению переменной, которой управляет свойство. Вместо этого базовую переменную для свойства автоматически предоставляет компилятор. Такое свойство называется и принимает следующую общую форму:

где тип обозначает конкретный тип свойства, а имя — присваиваемое свойству имя. Обратите внимание на то, что после обозначений аксессоров get и set сразу же следует точка с запятой, а тело у них отсутствует. Такой синтаксис предписывает компилятору создать автоматически переменную, иногда еще называемую поддерживающим полем, для хранения значения. Такая переменная недоступна непосредственно и не имеет имени. Но в то же время она может быть доступна через свойство.

Несмотря на очевидные удобства автоматически реализуемых свойств, их применение ограничивается в основном теми ситуациями, в которых не требуется управление установкой или получением значений из поддерживающих полей. Напомним, что поддерживающее поле недоступно напрямую. Это означает, что на значение, которое может иметь автоматически реализуемое свойство, нельзя наложить никаких ограничений. Следовательно, имена автоматически реализуемых свойств просто заменяют собой имена самих полей, а зачастую именно это и требуется в программе. Автоматически реализуемые свойства могут оказаться полезными и в тех случаях, когда с помощью свойств функциональные возможности программы открываются для сторонних пользователей, и для этой цели могут даже применяться специальные средства проектирования.

Using "value" as an identifier in C#

In writing short helper functions, I often find myself wanting to use the variable identifier «value» as an argument. It seems as though Visual Studio compiles this just fine, and has no complaints, when I do this:

However, Visual Studio complains at the following (as expected):

This leads me to believe that «value» is treated as a keyword (or not) depending on the context. I am fairly new to C# and, as far as I know, I have not seen context-specific keywords in other languages.

The question: Is it always safe to use «value» as a variable name outside of a property setter? If not, when can this be done safely? And, is this often considered bad practice?

I was surprised that I wasn’t able to find this question already asked on SO, and I suspect that someone has asked it before. However, it is difficult to search for because so many posts have «variable» and «identifier» in the title. I was unable to find information about this on MSDN.

EDIT: The last question is meant to ask if it is often or commonly frowned upon. It has been changed to reflect this.

6 Answers 6

Here’s what MSDN says:

The set accessor resembles a method whose return type is void. It uses an implicit parameter called value, whose type is the type of the property.

The properties are basically syntactic sugar that avoids you having to write a lot of get_Bar and set_Bar methods (note: there are some other advantages too, the CLR knows it’s a property). For example, if you have a class like this:

It’ll generate IL (for the setter) that looks something like this:

The thing to note here is that the set_Bar method takes a parameter called value . So not only does it «resemble» a method whose return type is void with a parameter called value , it actually is that.

So you can’t use value for something else in a setter, obviously.

Now should you use it elsewhere? It depends. If it’s obvious what it’s referring to in the context where you are using it then sure. If value is ambiguous in a particular context then use something more explicit.

The contextual keyword value is used in the set accessor in ordinary property declarations.

It makes no mention of any other context where value is considered a keyword, so aside from a setter, or anywhere else where it might have been defined already, you should be fine using value . Is it bad practice? Not as a rule, no more than any other potentially ambiguous variable name.

Edit: One place where I think having value as a name would be really problematic would be as a field (or worse a property) in a class. For example:

Читать:
Как сделать мессенджер на python

Похожие статьи