@Just_Graf

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

Допустим, есть класс MyClass, в котором есть поле age. Далее, в методе Main создаём экземпляр класса "MyClass" с именем "my". И на "my" присваиваем полю age, допустим, 5.
Т. е. главный вопрос, как нужно комментировать эту строку: "my.age = 5"? У меня два варианта: Первый вариант: "На экземпляре my присваиваем полю age 5", второй вариант: "На переменной типа MyClass с именем my присваиваем полю age 5". Какой вариант правильнее? Или есть другое описание этого действия?
Я бы не стал задавать этот (банальный для профи) вопрос, если бы не один момент: Если описывать это строку (my.age = 5) первым вариантом, то получается про методы так нельзя говорить, т. е. методы вызывать нельзя на экземпляре, вы спросите "почему?")), а я отвечу потому что, как мне объяснили в видеоуроке "Экземпляр хранит нестатические поля", а "Объект содержит статические поля и все методы". Да, и из этого следует, что вызывая метод на экземпляре "my", т. е. д, вообще нельзя так говорить, что "вызываем метод на экземпляре", если методы хранятся в объектах. Да, много настрочил... Ещё раз задам вопрос, если вы запутались: Как мне называть этот "my"? В различных ситуациях его нужно называть по-разному?

p. s. Я, естественно, нахожусь в начале обучения, но примерно уже понял в чём суть, понял всё пока писал этот вопрос, но всё равно жду от вас ответов, чтобы узнать верны ли мои предположения.

И до изучения статических классов я пока не дошёл, потому что я сначала вдоль и поперёк изучаю один видеоурок.
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
SomeClass obj = new SomeClass();
Нужно понимать, что происходит в этой строке. В этой строке происходит две вещи:
1) создаётся экземпляр класса SomeClass и размещается в куче (специальном месте для хранения объектов). Сами экземпляры не имеют собственных имён, только адрес в куче.
2) объявляется локальная переменная, и в эту переменную присваивается адрес вновь созданного объекта. Имя именно у переменной, а не у объекта!
Теперь с объектом можно работать по ссылке, например, присваивать поля и свойства и вызывать методы. Может быть несколько разных ссылок на один объект, но одна ссылка не может быть на несколько объектов (в ссылочной переменной - просто конкретный адрес).

Теперь разберёмся с терминами "экземпляр" и "объект". Экземпляр является объектом, но не все объекты являются экземплярами определённого класса (например, структуры - это объекты, но не экземпляры класса. Чтобы лучше понять это, нужно изучить различие переменных по ссылке и по значению). В языке C# практически всё является объектом (даже примитивные типы могут рассматриваться как объекты). В том числе, и экземпляры класса. Класс можно считать "шаблоном", который указывает правила создания объекта (количество и тип полей в объекте).

Статические элементы класса не принадлежат ни одному объекту (экземпляру), можно сказать, эти элементы принадлежат самому классу. Поэтому, нельзя обратиться к статическому элементу через переменную экземпляра, но можно обратиться просто по имени элемента в коде метода. В том видеоуроке объяснено неверно.

главный вопрос, как нужно комментировать эту строку: "my.age = 5"?

Присвоить значение 5 полю age объекта на который ссылается переменная my (зачеркнутый текст обычно не говорится, но подразумевается). Вместо слова "объекта" можно сказать "экземпляра", это тоже верно (потому что экземпляр - это тоже объект).
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Amffore
@Amffore
студент, учу c#
Вы полю age объекта my типа MyClass присваиваете значение равное 5.

А зачем Вам комментировать данную строчку, ведь и так понятно, что Вы пытаетесь сделать?
Ответ написан
@cicatrix
было бы большой ошибкой думать
Полю Age экземпляра my класса MyClass присвоено значение 5.
Класс MyClass
Экземпляр класса - my
Поле - Age

У класса могут быть как статические члены (поля, свойства, методы), так и не статические. Особняком стоят константы, делегаты и перечисления, для которых слово static как бы подразумевается.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Правильно не комментировать эту строку, кроме как, если число 5, имеет какое то "магическое" значение, но и то в этом поступают по другому, заводим константу и её уже комментируем, типа
class MyClass
{
   //This MAGIC_FIVE used for.....
   const int MAGIC_FIVE = 5;

  void ClassMethod()
 {
   
    otherClass.Property=MAGIC_FIVE;
 }

}


В таком случае читаемость заметно увеличивается. Комментарии даже очень лишними бывают.
Ответ написан
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Если уж вы добрались до таких сложных вопросов, то пора и книжки читать соответствующие:

C# Language Specification:
https://www.microsoft.com/en-us/download/details.a...

В частности, по обозначенному вами вопросу там написано вот что:
1.6.1 Members
The members of a class are either static members or instance members. Static members belong to classes, and instance members belong to objects (instances of classes).


1.6.5 Fields
A field is a variable that is associated with a class or with an instance of a class.
A field declared with the static modifier defines a static field. A static field identifies exactly one storage location. No matter how many instances of a class are created, there is only ever one copy of a static field.
A field declared without the static modifier defines an instance field. Every instance of a class contains a separate copy of all the instance fields of that class.


1.6.6 Methods
A method is a member that implements a computation or action that can be performed by an object or class. Static methods are accessed through the class. Instance methods are accessed through instances of the class.


1.6.6.3 Static and instance methods
A method declared with a static modifier is a static method. A static method does not operate on a specific instance and can only directly access static members.
A method declared without a static modifier is an instance method. An instance method operates on a specific instance and can access both static and instance members. The instance on which an instance method was invoked can be explicitly accessed as this. It is an error to refer to this in a static method.
The following Entity class has both static and instance members.
class Entity
{
	static int nextSerialNo;
	int serialNo;
	public Entity() {
		serialNo = nextSerialNo++;
	}
	public int GetSerialNo() {
		return serialNo;
	}
	public static int GetNextSerialNo() {
		return nextSerialNo;
	}
	public static void SetNextSerialNo(int value) {
		nextSerialNo = value;
	}
}

Each Entity instance contains a serial number (and presumably some other information that is not shown here). The Entity constructor (which is like an instance method) initializes the new instance with the next available serial number. Because the constructor is an instance member, it is permitted to access both the serialNo instance field and the nextSerialNo static field.
The GetNextSerialNo and SetNextSerialNo static methods can access the nextSerialNo static field, but it would be an error for them to directly access the serialNo instance field.
The following example shows the use of the Entity class.
using System;
class Test
{
	static void Main() {
		Entity.SetNextSerialNo(1000);
		Entity e1 = new Entity();
		Entity e2 = new Entity();
		Console.WriteLine(e1.GetSerialNo());				// Outputs "1000"
		Console.WriteLine(e2.GetSerialNo());				// Outputs "1001"
		Console.WriteLine(Entity.GetNextSerialNo());		// Outputs "1002"
	}
}

Note that the SetNextSerialNo and GetNextSerialNo static methods are invoked on the class whereas the GetSerialNo instance method is invoked on instances of the class.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы