Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты 13-25 (от Кати).doc
Скачиваний:
3
Добавлен:
24.04.2019
Размер:
236.54 Кб
Скачать

24) Ссылка this.

Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения.

Ниже перечислены наиболее частые способы использования this.

  • Для квалификации элементов, скрытых одинаковыми именами, например:

public Employee(string name, string alias)

{

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

this.name = name;

this.alias = alias;

}

  • Для передачи другим методам объекта в качестве параметра, например:

  • CalcTax(this);

  • Для объявления индексаторов, например:

public int this[int param]

{

get { return array[param]; }

set { array[param] = value; }

}

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

Пример

В этом примере this используется для квалификации членов класса Employee, name и alias, которые скрыты одинаковыми именами. Также это ключевое слово используется для передачи объекта в метод CalcTax, который принадлежит к другому классу.

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 MainClass

{

static void Main()

{

// Create objects:

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

// Display results:

E1.printEmployee();

}

}

/*

Output:

Name: Mingda Pan

Alias: mpan

Taxes: $240.00

*/

25) Копирование объектов.

Это делается с помощью конструктора копий…

В отличие от некоторых языков в C# отсутствует конструктор копии. Если создан новый объект и требуется скопировать значения из существующего объекта, необходимо создать соответствующий метод самостоятельно.

Пример

В данном примере класс Person содержит конструктор, который принимает другой объект типа Person в качестве аргумента. Содержимое полей в данной объекте назначается полям в новом объекте. Конструктор новой копии отправляет значения полей name и age копируемого объекта конструктору экземпляра класса.

class Person

{

private string name;

private int age;

// Copy constructor.

public Person(Person previousPerson)

{

name = previousPerson.name;

age = previousPerson.age;

}

//// Alternate copy contructor calls the instance constructor.

//public Person(Person previousPerson)

// : this(previousPerson.name, previousPerson.age)

//{

//}

// Instance constructor.

public Person(string name, int age)

{

this.name = name;

this.age = age;

}

// Get accessor.

public string Details

{

get

{

return name + " is " + age.ToString();

}

}

}

class TestPerson

{

static void Main()

{

// Create a new person object.

Person person1 = new Person("George", 40);

// Create another new object, copying person1.

Person person2 = new Person(person1);

Console.WriteLine(person2.Details);

// Keep the console window open in debug mode.

Console.WriteLine("Press any key to exit.");

Console.ReadKey();

}

}

// Output: George is 40