2015-09-19 2 views
0

Я не понимаю, почему и как я могу создать экземпляр переменной и не присваивать ей ничего в начале класса, но после того, как я попаду в кодировку класса, я 'm может назначить его для его использования. Например, в Unity я могу:Почему я создаю экземпляр, прежде чем использовать

public class MapGenerator : MonoBehaviour { 

// right here I can instantiate the variable... 
    public int width; 
    public int height; 

// and then here I actually use it!! 
    void GenerateMap() { 
     map = new int[width,height]; 
     RandomFillMap(); 

Может кто-то пожалуйста, выяснить это для меня?

+4

Почему это меченой 'Java'? – Michael

+1

Ваш экземпляр переменной, объявляя ее. – rhughes

+0

Извините за неправильную терминологию. Все еще изучаю все, что могу. – Letholor

ответ

1

JSL §4.12.5 определяет, что:

Каждая переменная в программе должна иметь значение, прежде чем его значение используется:

Каждая переменная класса, переменная экземпляра, или компонент массива инициализируется со значением по умолчанию, когда он (§15.9, §15.10):

Для байта типа значение по умолчанию равно нулю, то есть значение (байт) 0.

Для типа short значение по умолчанию равно нулю, то есть значение (короткое) 0.

Для типа INT, значение по умолчанию равно нулю, то есть 0.

Для типа длиной, по умолчанию значение равно нулю, то есть 0L.

Для типа float значением по умолчанию является положительный ноль, то есть 0.0f.

Для типа double значение по умолчанию - положительный ноль, то есть 0.0d.

Для символа типа значением по умолчанию является нулевой символ, то есть '\ u0000'.

Для типа boolean значение по умолчанию равно false.

Для всех ссылочных типов (§4.3) значение по умолчанию равно null.

Код, который вы дали неявно делает это в Java:

public int width; 
public int height; 

public MapGenerator() { // Constructor 
    width = 0; 
    height = 0; 
} 

void GenerateMap() { 
    map = new int[width,height]; 
} 

Я предполагаю, что C# делает что-то подобное.

+1

Этот ответ для Java, хотя вопрос о C# – rhughes

+1

большое вам спасибо. Это очень помогло. Мне было интересно узнать код для C# и для Java. Я не был уверен, могу ли я отмечать оба языка, так как они настолько похожи на уровне новичка, что я и есть. – Letholor

+0

@Letholor Glad Я мог бы помочь :) –

2

Value Types (C# Reference)

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

Примечание:

  • Обратите внимание, что инициализатор работает только для членов класса.
  • Локальные переменные должны быть инициализированы до их использования.

Значения по умолчанию для типов:

bool: false 
byte: 0 
char: '\0' 
decimal: 0.0M 
double: 0.0D 
enum: The value produced by the expression (E)0, where E is the enum identifier. 
float: 0.0F 
int: 0 
long: 0L 
sbyte: 0 
short: 0 
struct: The value produced by setting all value-type fields to their default values and all reference-type fields to null. 
uint: 0 
ulong: 0 
ushort: 0 

Class член - OK

public class Sample1 
{ 
    int i; 
    public void PrintI() 
    { 
     //Prints 0 
     Console.WriteLine(i.ToString()); 
    } 
} 

Локальная переменная - ОШИБКА

public class Sample2 
{ 
    public void PrintI() 
    { 
     int i; 
     //Compile Error: Use of unassigned local variable 'i' 
     Console.WriteLine(i.ToString()); 
    } 
} 
0

В этом разница между типами значений и ссылочными типами.

Типы значений (которые передаются по значению) - это просто значения. Хотя ссылочные типы относятся к месту, где это значение.

Все типы имеют значение по умолчанию, для ссылочных типов оно равно null, которое вы можете думать о «относится к Nothing», для типов значений оно не может быть, значение не может быть нулевым, поэтому существует значение по умолчанию стоимость.

Здесь он работает, потому что int является типом значения, что означает, что он даже унифицирован по умолчанию (для всех типов номеров, значение которого равно 0), если вместо этого это был ссылочный тип, вы получали бы исключение NullReferenceException при попытке использовать его неинициализированным.

Так, например:

public class Player 
{ 
     public string Name; 
} 

    int i; // This is the same as int i = 0 as default(int) == 0 
    i.ToString(); // does not crash as i has a default value; 

    Player p; // This is a reference type, the value fo default(Player) is null 
    p.ToString(); // This will crash with a NullReferenceException as p was never initialized and you're effectivelly calling a method on "null". 
0

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

public class MapGenerator 
{ 
    public int width; 
    public int height; 

    public MapGenerator(int Con_width, int Con_height) 
    { 
     width = Con_width; 
     height = Con_height; 
    } 
} 

теперь любой объект класса U создать необходимо иметь значение для ширины и высоты

MapGenerator mymap = new MapGenerator(200,200); 

Теперь, если и попробовал обычный объект

MapGenerator mymap = new MapGenerator(); 

это даст U ошибку, потому что вы изменили это по умолчанию constractor на новый пользовательский constractor

Смежные вопросы