2009-07-29 3 views
1

В следующем курсивом код, почему бы нам не поставить «IntIndexer» перед myData = new string [size]; с Клиент cust = новый Клиент(); (предполагается, что Клиент имя класса):В чем разница между этими двумя строками? (C#)

*Customer cust = new Customer();* 

с использованием системы;

/// <summary> 
///  A simple indexer example. 
/// </summary> 
class IntIndexer 
{ 
    private string[] myData; 

    public IntIndexer(int size) 
    { 
     *myData = new string[size];* 

     for (int i = 0; i < size; i++) 
     { 
      myData[i] = "empty"; 
     } 
    } 

ответ

5

Чтобы разорвать этот вниз:

Customer cust = new Customer(); 

Это может быть разбит на две части:

Customer cust; 
cust = new Customer(); 

Первая строка говорит о том, что имя cust будет иметь возможность ссылаться на объекты типа Customer. Вторая строка создает новый объект Customer и ссылается на него cust.

Другой пример вы даете уже сломаны в эти две части:

private string[] myData; 

и:

myData = new string[size]; 

Если массив строк должен был быть постоянной длины, мы могли бы свернуть это на одну строку, в IntIndexer (перед конструктором).

private string[] myData = new string[100]; 

Но мы должны использовать size переходила в IntIndexer конструктор, поэтому мы должны разделить объявление и инициализацию в два этапа.

0

Вы пытаетесь поместить вызов в конструктор внутри себя? Как и в случае, если вы хотите создать экземпляр IntIndexer, вам нужно вызвать эту функцию и повторить процесс до тех пор, пока вы не поймете, что это приведет к переполнению стека или просто не прекратится, поскольку он всегда будет пытаться создать n-й экземпляр, поскольку n просто продолжает идти и идти вверх.

Что мне не хватает в вашем примере, если я просто прослежу его таким образом?

5

Первая строка (cust) объявляет и инициализирует поле или переменную.

Во втором примере поле (myData) объявлено против типа и проиндексировано в конструкторе (IntIndexer(...)). Если (в конструкторе) мы поместили перед ним тип, мы бы объявили локальную переменную с тем же именем. Это было бы запутанным (вам нужно было бы использовать this.myData и myData для обозначения поля и переменной соответственно).

0

Это две разные вещи. myData объявлен как тип string[], а не типа IntIndexer.

Класс IntIndexer содержит переменную, называемую myData. Они не эквивалентны.

Вы так же не поместили бы тип перед этой строкой кода, потому что вы бы обновили переменную. Это даст вам ошибку компилятора.

0

myData уже объявлен как поле класса IntIndexer, поэтому вам не нужно его повторно использовать в конструкторе. Класс понимает, что он ссылается на свое поле.