Опубликован: 01.11.2004 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 15:

С#. Классы и структуры.

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Создание экземпляра класса

Для использования переменных или методов класса следует создать объект - экземпляр класса.

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

Место выделения памяти под объект зависит от типа создаваемого объекта: объекты ссылочных типов размещаются в куче, а объекты размерных типов - в стеке.

Объявление переменной объектного типа в языке С# не создает объекта, а только определяет идентификатор указанного типа. Обратите внимание, что во многих объектно-ориентированных языках, таких как С++, объявление переменной объектного типа также становится и созданием экземпляра данного типа.

Например:

using System;
namespace MyNS
{
  public class A
  { public A()         // Конструктор без параметров
    { Console.WriteLine("A()");  }
   public A(int i)      // Конструктор с одним параметром
    { Console.Write("A(i) i= ");
            Console.WriteLine(i);   }
  }
}
using System;
namespace MyNS
{
  class MyClass
  {
     static void Main(string[] args)
      { A acl1= new A();    // Создание экземпляра класса
     A acl2= new A(987);
    }
  }
}
Явный вызов конструктора

Определение конструктора может содержать явный вызов конструктора того же класса. Вызываемый конструктор указывается после имени определяемого конструктора со списком параметров через символ двоеточия. Вызываемый конструктор может быть определен ключевым словом this - для вызова конструктора из того же самого класса, или ключевым словом base - для вызова конструктора базового класса. Явно вызываемый конструктор будет выполнен до выполнения конструктора, в котором он указывается.

Например:

public class A
{ public A():this(222) // Конструктор без параметров
  {  }
  public A(int i)  // Конструктор с одним параметром
    { }
  }
Методы члены класса

Среда проектирования Visual Studio .NET дает возможность использовать мастер создания метода - члена класса (в окне Class View выбрать имя класса и выполнить команду контекстного меню Add|Add Metod). Список Modifier. диалога . C# Metod Wizard позволяет указать один из следующих модификаторов параметра метода:

  • none - определяет передачу параметров по значению. Если внутри метода будет изменено значение фактического параметра, то вне метода его значение останется прежним;
  • ref - определяет передачу параметров по ссылке. Изменение параметра внутри метода останется и после завершения метода. ref-параметр перед использованием обязательно должен быть инициализирован;
  • out - определяет передачу параметров по результату. При завершении метода конечное значение формального параметра присваивается указанному при вызове фактическому параметру. При этом в момент вызова метода фактический параметр может не быть инициализирован.

Например:

public void Metod1(int i, ref int j, out int k)
    {      }

При обращении к методу или полю - членам класса используется операция . (точка) - доступ к члену класса. Имя поля или метода члена класса квалифицируется именем экземпляра класса.

Язык C# позволяет использовать методы с переменным числом параметров. Для метода с переменным числом параметров должны быть выполнены следующие правила:

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

Количество параметров в переменном списке параметров определяется свойством Length .

Например:

using System;
public class MyClass1 
{
   public static void UseParams1(params int[] list) 
   {
      // Отображение списка параметров
      for ( int i = 0 ; i < list.Length ; i++ )
         Console.WriteLine(list[i]);
   }
   public static void UseParams2(params object[] list) 
   {  // В переменном списке параметров могут быть
      // объекты различных типов
      for ( int i = 0 ; i < list.Length ; i++ )
         Console.WriteLine((object)list[i]);
   }
public static void UseParams3(int k,params object[] list) 
    {  // В переменный список параметров 
                  // включаются параметры, начиная
                  // со второго
    for ( int i = 0 ; i < list.Length ; i++ )
    Console.WriteLine((object)list[i]);
    }
   public static void Main() 
   {
      UseParams1(1, 2, 3, 4, 5);
      UseParams1(1, 2);
      int[] myarray = new int[3] {1,2,3};
      UseParams1(myarray);
      UseParams2(111, 'f', "string"); 
      UseParams3(111, 'f', "string"); 

   }
}
Листинг 15.2.
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);