Синтаксис для переменных C # - почему двойное использование имени класса при определении нового экземпляра? - PullRequest
0 голосов
/ 24 февраля 2012

Довольно просто на самом деле.

Начинающий с C # и пытающийся понять причины синтаксиса для назначения новых экземпляров переменным.

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

Если у вас есть фрагмент кода, определяющий переменную mm, как показано ниже:

using System;

class MyMethod
{
    public static void Main()
    {
        string myChoice;

        MyMethod mm = new MyMethod();

Зачем вам нужен первый «MyMethod» перед «мм»

Другими словами, почему вы не можете просто поставить

mm = new MyMethod();

вместо

MyMethod mm = new MyMethod();

Насколько я знаю (а это может быть совершенно неправильно), поставив '= New MyMethod ();' вы определяете новый экземпляр класса MyMethod и присваиваете его 'mm'. Объект «mm» уже существует в классе «MyMethod», так почему дополнительный «MyMethod» перед «mm». Мне кажется это излишним, поэтому хочу понять с точки зрения выполнения кода, что происходит.

Заранее спасибо за помощь / совет

Ответы [ 5 ]

2 голосов
/ 24 февраля 2012

Вы можете использовать var mm = new MyMethod();
Затем компилятор автоматически определит тип переменной.

Кстати: MyMethod - довольно плохое имя для класса .


Следующая часть вашего вопроса не верна:

Объект 'mm' уже существует в классе 'MyMethod'

Это не так.mm не существует в этом классе.

1 голос
/ 24 февраля 2012

В предоставленном коде нет ничего, что указывало бы на то, что mm существует в классе MyMethod. Это переменная, которая существует только внутри этого метода, поэтому вам нужно указать ее тип при инициализации.

0 голосов
/ 24 февраля 2012

Синтаксис написания вашего кода:

MyMethod mm = new MyMethod();

это на самом деле только короткая форма письма

MyMethod mm;
mm = new MyMethod();

Где в первой строке вы указываете тип переменной, которую вы хотите использовать ( объявление ), и указываете среде выполнения, что ей потребуется выделить для нее память, а во второй строке вы присваиваете фактическое значение для него ( определение ).

[Изменить]

В первой строке становится очевидным, что вам понадобится , чтобы указать тип переменной, иначе вы бы сократили строку до определения только name переменной и компилятор не будет знать что это:

mm;

[/ Изменить]

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

[Редактировать 2]

Подумайте об определении переменной MyMethod mm = new MyMethod(); как переменной, как любой другой. Компилятору все равно, если вы делаете это в классе MyMethod или в любом другом классе.

Если бы ваш код выглядел так, было бы более очевидно, что между различными типами OtherClass и MyMethod.

нет никакой связи.
using System;

class OtherClass
{
    public static void Main()
    {
        string myChoice;

        MyMethod mm = new MyMethod();
    }
}

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

0 голосов
/ 24 февраля 2012

Объект 'mm' уже существует в классе 'MyMethod'

Нет, это не так.

Ну, он объективен.но не переменная.

MyMethod mm =

declatrres переменная с именем mm типа MyMethod.

Вы также можете написать его как

var mm

и позволить компилятору отсортировать тип.

Но в конце вам нужно объявить переменную, которой назначен новый объект.

Это похоже на то, что .NET требует, чтобы переменные были decalerd, поэтому ошибки при наборе имени - использование «mn» позже приведет к исключению «не знаю n», а nto - к нулевому указателю, поскольку переменная неявносозданный будучи использованным.

0 голосов
/ 24 февраля 2012

Это старый стандарт, потому что вы можете захотеть сделать что-то вроде этого

IContact contact = new Person();

Но вы можете сделать так, чтобы компилятор выводил тип, написав вместо этого "var".Я использую это, когда тип очевиден из чтения той же строки (например, выше, если вы хотите, чтобы тип был «Person», а не «IContact»), но при назначении чего-либо в результате вызова метода, я явно про тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...