Какой смысл ключевого слова var?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

47
задан Ed Guiness 29 August 2018 в 20:00
поделиться

8 ответов

Обновление: существует два связанных вопроса здесь на самом деле: 1. Почему я должен объявить переменные вообще? 2. Какое использование является "var" на языке, который заставляет Вас объявить переменные?

ответы на (1) являются многочисленными, и могут быть найдены в другом месте для этого вопроса. Мой ответ на (2) ниже:

, Поскольку другие комментаторы сказали, LINQ использует это для своих анонимных типов. Однако LINQ является на самом деле экземпляром более общей проблемы, где тип правой стороны выражения является или неизвестным программисту или является чрезвычайно подробным. Рассмотрите:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Подробный и подверженный ошибкам, правильно? Таким образом, теперь они позволяют Вам сделать это:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

Путем сокращения дублирования информации, ошибки устраняются. Обратите внимание, что нет просто опечаток, здесь: для типа левого выражения возможно быть введенным с опечаткой таким способом, которым компилятор может тихо бросить слева направо, но бросок на самом деле утрачивает некоторое имущество rvalue. Это еще более важно, когда типы, возвращенные rvalue, могут быть неизвестными или анонимными.

45
ответ дан Johnno Nolan 26 November 2019 в 19:16
поделиться

Это немного субъективно, но я думаю, разрабатывая C# 3.0 для имения ключевого слова "var" для переменных с неявно определенным типом вместо никакого ключевого слова, делает код более читаемым. Например, первый блок кода ниже более читаем, чем второе:

Очевидный, где переменная объявляется:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

Не очевидный, где переменная объявляется:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

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

6
ответ дан Jason Jackson 26 November 2019 в 19:16
поделиться

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

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name
47
ответ дан Ferruccio 26 November 2019 в 19:16
поделиться

В Вашем вопросе, var увеличивает стоимость кода путем сообщения компилятора, Word anon теперь законен для использования где угодно, Вы ожидали бы видеть объект типа, подразумеваемого в присвоении. Требование введения имен к компилятору как это позволяет компилятору отклонять вещи, которые это не было явно сказано, позволяются, и таким образом ловят определенные виды ошибок во время компиляции, таким образом, они не аварийно завершаются во времени выполнения.

, Например, в разделе обновления Вашего вопроса, Вы спросили об этом отрывке:

anon = new { Name = "Terry", Age = 34 };

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

Ваш ответ состоит в том, что Boo делает это, таким образом, это должно быть хорошо или по крайней мере возможно. Но это - отвлекающий маневр. Мы говорим о C#, не Boo. Одна из целей C# состоит в том, чтобы иметь язык, где компилятор может зафиксировать как можно больше ошибок. Boo хочет сделать это также, но это также хочет больше быть похожим на Python. Таким образом, это жертвует [приблизительно 113] (не все) безопасности времени компиляции C# в обмен на подобный Python синтаксис.

4
ответ дан Joel Coehoorn 26 November 2019 в 19:16
поделиться

правовая оговорка: моими примерами является Java, потому что это - то, что я знаю, но понятия должны быть идентичными.

я проголосовал за ответ, который я чувствую, очень важно (слишком легко случайно создать новую переменную).

bill=5;
bi11=bill+5

, Каково значение счета?

Однако я нахожу его несколько раздражающим время от времени для ввода:

DataOutputStream ds=new DataOutputStream();

Кажется избыточным, но честно нет ничего действительно неправильно с ним. Это не берет Вас больше для ввода его дважды, и это чрезвычайно полезно. То, что занимает время, - когда у Вас есть вопросы - когда Вы не уверены, как использовать некоторый API. Если это действительно беспокоит Вас для ввода того описания типа дважды, то, почему Вы тратите впустую свое время здесь? Так как Вы начали читать это, Вы, возможно, ввели 30 или 40 объявлений, достаточно для каждого объявления, в котором Вы будете нуждаться в течение следующих двух недель.

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

Еще одна вещь, БОЛЬШУЮ ЧАСТЬ ВРЕМЕНИ код не должен быть похожим на мой пример выше. То, что необходимо делать, является этим:

DataOutput ds=new DataOutputStream();

Это сразу скрывает то, что Вы используете реальный класс в шаблон. Тот шаблон должен быть в состоянии сделать все операции, в которых Вы нуждаетесь на своем классе. Позже, если Вы хотели заменить ds некоторым другим видом потока вывода, просто изменение той одной строки зафиксирует его. Если Вы использовали функции, не доступные DataOutput путем кастинга в DataOutputStream, редактор легко поймет его и сообщит.

2
ответ дан Bill K 26 November 2019 в 19:16
поделиться

Для анонимных типов, которые среди других вещей поддерживают LINQ.

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

-1
ответ дан BlackWasp 26 November 2019 в 19:16
поделиться

Я полагаю, что var (и несколько других новых ключевых слов) был добавлен конкретно для поддержки Linq.

var является ключевым словом, используемым для создания анонимного типа - видят http://msdn.microsoft.com/en-us/library/bb397696.aspx

, Анонимные типы могут использоваться в других местах, чем Linq.

var exceedingy полезный для Linq. На самом деле, по словам одного опытного автора, " Без ‘var’, LINQ становится слишком болезненной для использования. "

-1
ответ дан DOK 26 November 2019 в 19:16
поделиться

Я понимаю потребность в var, и он отлично справляется с этой задачей. Отсутствие ключевого слова и просто определение переменных на лету без типа - это страшно. Вы причиняете боль следующему парню, который должен поддерживать ваш код или себя, если вам нужно переделать код, который вы не затрагивали более года. Я не уверен, что это дверь, которую нужно открывать в C #, и я надеюсь, что это не так, поскольку var уже вызывает проблемы с читабельностью, когда используется слишком часто, когда в этом нет необходимости.

Почти каждый пример .net 3.5, который я вижу В последнее время все переменные определены с помощью var.

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

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

Проблема, которую я вижу, состоит в том, что люди используют ее повсюду ... например:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

Таким образом, следующий аргумент будет, просто назовите функцию лучше ... 1238 До сих пор не знаю, что возвращается. Это объект типа int, decimal, float, weight, что? Мне все еще приходится тратить время на его поиски ... нужен костяк intellisense, чтобы спасти день от ленивого программирования. Может быть, включить тип возвращаемого значения в имя функции. Хорошая идея, теперь использование var не спасло нас ни от чего, кроме того, что у всех моих функций были действительно длинные имена.

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

Может быть, включить тип возвращаемого значения в имя функции. Хорошая идея, теперь использование var не спасло нас ни от чего, кроме того, что у всех моих функций были действительно длинные имена.

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

Может быть, включить тип возвращаемого значения в имя функции. Хорошая идея, теперь использование var не спасло нас ни от чего, кроме того, что у всех моих функций были действительно длинные имена.

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

40
ответ дан 26 November 2019 в 19:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: