Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:
Модификатор доступа Цель Эквивалент в Java Описание По умолчанию
public
Все
public
Без ограничений. Члены
enum
и
interface
, а также пространства имен.
private
Все
private
Доступны только объявляющему классу. Члены
class
и
struct
.
internal
Все недоступно Доступны файлам в той же сборке.  
protected
Все недоступно Доступны для объявляющего класса и любых его подклассов. В C#
protected
более ограничен, чем в Java. Закрытый (
protected
) доступ не позволит другим файлам в той же сборке иметь доступ к члену.
 
protected internal
Все
protected
Доступны для файлов сборки и подклассов объявляющего класса.  

Конструкторы

Первый метод, который будет вызван в классе в процессе создания экземпляра объекта,— это конструктор. Утверждение справедливо для Java, C++, C# и других языков. Фактически, даже если специально не писать свой собственный конструктор, будет создан конструктор по умолчанию. Но в C# обращение к объекту-предку или другому конструктору обрабатывается совершенно по-другому, чем в Java:

public class Parent {

}

public class Sample: Parent {

 private string internalVal;

 private string newVal;

 public Sample:base {}

 public Sample(String s) {

internalVal = s;

 }

 public Sample(String s, String t) : this(s) {

newVal = t;

 }

}

Из этого примера видно, что выполнение вызова конструктора предка или даже другого конструктора можно сделать, "расширяя" его с помощью символа "

:
". В случае конструктора предка используется ключевое слово
base
для идентификации источника, исходящего из объекта предка, в то время как это используется для идентификации источника, исходящего из другого конструктора объекта. Применение подходящей сигнатуры к
base
вызовет соответствующий конструктор предка, так же как применение правильной сигнатуры вызовет правильный внутренний конструктор. Мы подчеркнем это, делая некоторые изменения в класс
Sample
:

public class Parent {

 protected Parent(string a) {

Console.WriteLine(a);

 }

 protected Parent {

Console.WriteLine("This is the base constructor");

 }

}

public class Sample: Parent {

 public Sample {

 }

 public Sample(String s):base(s) {

 }

 public Sample(String s, String t): this(s) {

Console.WriteLine(t);

 }

}

C# вводит концепцию деструкторов, позаимствованную из C++. Они работают аналогично завершителям (

finalizer
) в Java, их синтаксис, однако, существенно отличается. Деструкторы используют логический знак отрицания (
~
) в качестве префикса для имени класса:

~Sample {

}

Рекомендация в отношении кода деструктора: "сборщик мусора" в .NET не вызывается сразу же после того, как переменная покидает область действия. На самом деле имеется некоторый интервал времени или условия памяти, которые инициируют поток выполнения. Бывают случаи, когда деструктор запускается в условиях нехватки памяти, поэтому желательно делать его код как можно короче. Также неплохо вызывать

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

Методы

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

in
(это способ передачи параметров по умолчанию), по ссылке, как параметр
ref
, или как параметр
out
. Следующий код:

public static void Main(string[] args) {

 int a = 10;

 Console.WriteLine(a);

 Add(a);

 Console.WriteLine(a);

}

public static void Add(int a) {

 a++;

}

будет создавать результат, показанный ниже, как в C#, так и в Java:

10

10

Мы передаем

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

public static void Main(string[] args) {

 int a = 10;

 Console.WriteLine(a);

 Add(ref a);

 Console.WriteLine(a);

}

public static void Add(ref int a) {

 a++;

}

и получить:

10

11

Чтобы использовать ссылочный параметр, надо перед типом параметра использовать ключевое слово

ref
. В противоположность двум другим типам параметров параметры
out
не нуждаются в инициализации, перед тем как они передаются в качестве аргументов, они используются для передачи значений назад из метода. Следующий код создаст результат 100:

  • Читать дальше
  • 1
  • ...
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: