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

Первичные выражения включают самые простые формы выражений.

Первичное выражение создания не массива:

литерал

простое имя

выражение в скобках

доступ к члену

выражение вызова

метод доступа к элементу

доступ через this

доступ к базовому объекту

выражение после инкремента

выражение после декремента

выражение создания объекта

выражение создания делегата

 выражение typeof

выражение checked

выражение unchecked

выражение значения по умолчанию

Простые имена

Просто имя состоит из идентификатора, за которым может следовать список аргументов типа:

простое_имя:
индетификатор список_аргументов_типанеобязательно

Для каждого вхождения данного идентификатора в качестве простого_имени в выражении или деклараторе внутри области объявления локальных переменных, непосредственно включающей это вхождение, каждое вхождение того же самого идентификатора в качестве простого_имени в выражении или декларатора должно ссылаться на одну и ту же сущность. Это правило позволяет гарантировать, что внутри определенного блока, блока switch, а также операторов for, foreach и using имя всегда имеет одинаковое значение.

Правило инвариантности значения применяется только к простым именам. Один идентификатор вполне может иметь одно значение в виде простого имени и другое значение в виде правого операнда в методе доступа к члену. Например:

using System;

 

namespace ConsoleApplication7

{

struct Point

{

   int x, y;

   public Point(int x, int y)

   {

       this.x = x;

       this.y = y;

   }

   public override string ToString()

   {

       return String.Format("{0} {1}", x, y);

   }

}

 

class Program

{

   static void Main(string[] args)

   {

       Point p = new Point(3, 5);

       Console.WriteLine(p);

 

   }

}

}

В примере простые имена x и y относятся к параметрам, но это не мешает выражениям доступа к членам this.x и this.y иметь доступ к полям.


Выражения со скобками

Выражение_со_скобками состоит из выражения, заключенного в скобки.

выражение_в_скобках:
( выражение )

Выражение_со_скобками вычисляется путем вычисления выражения внутри скобок.


Доступ к члену

Оператор "точка" используется для доступа к членам.

Выражения вызова

Выражение_вызова используется для вызова метода.

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

Например

TestMethod();


Доступ this

Доступ_this представляет собой зарезервированное слово this.

доступ_через_this:
this

Доступ_this допустим только в блоке конструктора экземпляра, метода экземпляра или метода доступа к экземпляру.

Когда доступ this используется в основном_выражении внутри конструктора экземпляра структуры,  он классифицируется как значение. Типом значения является тип экземпляра структуры, внутри которой происходит это использование, а значением является создаваемая структура. Переменная this конструктора экземпляра структуры действует точно так же, как параметр out типа структуры, в частности, это означает, что переменная должна явно назначаться в каждом пути выполнения конструктора экземпляра.

Когда доступ this используется в основном_выражении внутри конструктора экземпляра класса, он классифицируется как значение. Типом значения является тип экземпляра класса, внутри которого происходит это использование, а значением является ссылка на создаваемый объект.

 

Примеры

Использование this для квалификации элементов, скрытых одинаковыми именами.

 

class Point

{

   int x, y;

   public Point(int x, int y)

   {

       this.x = x;

       this.y = y;

   }

       

   public override string ToString()

   {

       return String.Format("{0} {1}", x, y);

   }

}

 

 

Доступ this используется для передачи другим методам объекта в качестве параметра (пример из msdn)

 

using System;

 

namespace ConsoleApplication7

{

class Employee

{

   private string name;

   private string alias;

   private decimal salary = 3000.00m;

 

   // Constructor:

   public Employee(string name, string alias)

   {

       // Use this to qualify the fields, name and alias:

       this.name = name;

       this.alias = alias;

   }

   // Printing method:

   public void printEmployee()

   {

       Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);

       // Passing the object to the CalcTax method by using this:

       Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));

   }

 

   public decimal Salary

   {

       get { return salary; }

   }

}

 

class Tax

{

   public static decimal CalcTax(Employee E)

   {

       return 0.08m * E.Salary;

   }

}

 

 

class Program

{

   static void Main(string[] args)

   {

       Employee E1 = new Employee("Mingda Pan", "mpan");

 

       // Display results:

       E1.printEmployee();

 

 

   }

}

}

 

 

У статических функций-членов нет указателя this, так как они существуют только на уровне класса и не являются частями объектов. Использование ссылки на this в статическом методе является недопустимым.

Также this используется для объявления индексаторов.

 


Оператор new .

В языке C# ключевое слово new может использоваться в качестве оператора, модификатора или ограничения.

Оператор new

Используется для создания объектов и вызова конструкторов.

Модификатор new

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

Ограничение new

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

Оператор new используется для создания объектов и вызова конструкторов.

Пример (пример из msdn)

struct SampleStruct

{

public int x;

public int y;

 

public SampleStruct(int x, int y)

{

this.x = x;

this.y = y;

}

}

 

class SampleClass

{

public string name;

public int id;

 

public SampleClass() {}

 

public SampleClass(int id, string name)

{

this.id = id;

this.name = name;

}

}

 

class ProgramClass

{

static void Main()

{

// Create objects using default constructors:

SampleStruct Location1 = new SampleStruct();

SampleClass Employee1 = new SampleClass();

 

// Display values:

Console.WriteLine("Default values:");

Console.WriteLine(" Struct members: {0}, {1}",

        Location1.x, Location1.y);

Console.WriteLine(" Class members: {0}, {1}",

        Employee1.name, Employee1.id);

 

// Create objects using parameterized constructors:

SampleStruct Location2 = new SampleStruct(10, 20);

SampleClass Employee2 = new SampleClass(1234, "Luciana Ramos");

 

// Display values:

Console.WriteLine("Assigned values:");

Console.WriteLine(" Struct members: {0}, {1}",

        Location2.x, Location2.y);

Console.WriteLine(" Class members: {0}, {1}",

        Employee2.name, Employee2.id);

}

}

Если в определение структуры SampleStruct добавить конструктор экземпляра по умолчанию

public SampleStruct() { }

Это приведет к ошибке: Структуры не могут содержать явных конструкторов без параметров     

Выражения создания объектов

Выражение_создания_объекта используется для создания нового экземпляра типа_класса или типа_значения.

выражение_создания_объекта:
new тип ( список_аргументовнеобязательно ) инициализатор_объекта_или_коллекциинеобязательно
new тип инициализатор_объекта_или_коллекции

инициализатор_объекта_или_коллекции:
инициализатор_объекта
инициализатор_коллекции

Тип выражения_создания_объекта должен быть равен типу_класса, типу_значения или параметру_типа. Тип не может быть типом_класса abstract.

Во время выполнения обработка выражения_создания_объекта в виде new T(A), где T является типом_класса или типом_структуры, а A является необязательным списком_аргументов, включает следующие этапы.

· Если T является типом_класса:

o Создается новый экземпляр класса T.

o Все поля нового экземпляра инициализируются с помощью значений по умолчанию.

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

· Если T является типом_структуры:

o С помощью выделения временной локальной переменной создается экземпляр типа T. Поскольку для явного присвоения значений каждому полю создаваемого экземпляра требуется конструктор экземпляра типа_структуры, инициализация временной переменной не требуется.

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





Оператор typeof

Оператор typeof используется для получения объекта System.Type для типа.

Пример

System.Type type = typeof(int);

Пример

using System;

 

namespace ConsoleApplication7

{

class Employee

{

   private string name;

   private string alias;

   private decimal salary = 3000.00m;

 

   // Constructor:

   public Employee(string name, string alias)

   {

       // Use this to qualify the fields, name and alias:

       this.name = name;

       this.alias = alias;

   }

   // Printing method:

   public void printEmployee()

   {

       Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);

       // Passing the object to the CalcTax method by using this:

       Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));

   }

 

   public decimal Salary

   {

       get { return salary; }

   }

}

 

class Tax

{

   public static decimal CalcTax(Employee E)

   {

       return 0.08m * E.Salary;

   }

}

 

 

class Program

{

   static void Main(string[] args)

   {

       Employee E1 = new Employee("Mingda Pan", "mpan");

 

       // Display results:

       E1.printEmployee();

 

       Type t = typeof(Employee);

       // Alternatively, you could use

       // SampleClass obj = new SampleClass();

       // Type t = obj.GetType();

 

       Console.WriteLine("Methods:");

       System.Reflection.MethodInfo[] methodInfo = t.GetMethods();

 

       foreach (System.Reflection.MethodInfo mInfo in methodInfo)

           Console.WriteLine(mInfo.ToString());

 

       Console.WriteLine("Members:");

       System.Reflection.MemberInfo[] memberInfo = t.GetMembers();

 

       foreach (System.Reflection.MemberInfo mInfo in memberInfo)

           Console.WriteLine(mInfo.ToString());

 

           

   }

}

}

 

Унарные операторы.

Операторы +, -, !, ~, ++, -- и операторы приведения типа называются унарными операторами.

унарное_выражение:
основное_выражение
+ унарное_выражение
- унарное_выражение
! унарное_выражение
~ унарное_выражение
префиксное_выражение_инкремента
префиксное_выражение_декремента
выражение_приведения_типа









Унарный оператор «плюс»

Операция вида +x результатом является просто значение операнда. Унарные операторы + предопределены для всех числовых типов.

Унарный оператор «минус» .

Операция вида –x. Унарные операторы - предопределены для всех числовых типов.

Для целых чисел результат вычисляется вычитанием x из нуля. Для унарного оператора «–» операнд преобразуется к первому типу из набора int и long, которым может быть представлено значение операнда. Не допускается применение унарного оператора «–» к операндам типа ulong.

Пример

Данная программа вызовет ошибку: Постоянное значение "-17" не может быть преобразовано в "ulong"

ulong A = -17;

Console.WriteLine(A);

Пример. Если операнд оператора взятия обратного знака имеет тип uint, то он преобразуется в тип long.

uint a = 17;

var r = -a;

Console.WriteLine(r);

Результат

Дата: 2019-07-30, просмотров: 205.