将null分配给类的实例和just声明有什么区别? - c#

我试图了解将null分配给类的实例与仅声明类之间是否有区别。

例如,我有一个类:

public class MyClass
{
    public string FirstProperty { get; set; }
    public int SecondProperty { get; set; }
}

我声明了该类的两个实例:

MyClass Instance1 = null;
MyClass Instance2;  // just declaration

Instance1Instance2有什么区别?

如果是,那么安全吗?使用“仅delcaration”样式(如上例中的Instance2那样)是一个好习惯吗?

参考方案

然后,我创建该类的两个实例:

您没有创建任何实例。如果要创建实例,您将创建两个放置实例的地方。您明确地说的第一个实例没有实例,第二个实例没有实例。

Instance1Instance2有什么区别?

这取决于您在哪里完成。

如果该代码在classstruct内,则您已经创建了两个字段,除非构造函数执行其他操作,否则两个字段最初都将设置为null

如果您在方法(包括构造函数或属性访问器)中包含该代码,则您将拥有两个局部变量(尽管此处约定使用小写字母)。

第一个已设置为null,您可以使用它做与null有效的事情(将其传递给方法[尽管它拒绝接受null可能会引发异常)将其与某些东西进行比较以确认它是否为null确实为null或与确实具有实例的东西不同。

第二个尚未分配,因此,除了分配某些东西(无论是null还是实例)以外,做任何其他事情都是非法的。在明确设置之前做任何尝试的尝试都会导致编译器错误。例如。:

MyClass Instance2;
if (valueThatJustHappensToAlwaysBeTrue)
{
   Instance2 = new MyClass();
}
bool isNull = Instance2 == null; // Error! Not guaranteed to be assigned strongly enough for the compiler to know.

是的,仅使用声明是否具有Instance2是安全的,并且是一个好习惯吗?

在可能的情况下,最好同时声明一个尽可能接近第一个赋值(初始化)的习惯:

MyClass instance = new MyClass();

但是,如果您有几种不同的可能路径,例如:

MyClass instance;
if (boolValue)
{
   instance = new MyClass(1); // Yes, I know there's no int-taking ctor on your class, but it defeats the argument when the bare constructor is the only one available, so let's say there is.
}
else if (otherBoolValue)
{
   throw new SomeException();
}
else if (someIntValue > 42)
{
   instance = new MyClass(3);
}
else
{
   instance = new MyClass(9);
}

现在,用未初始化的instance到达该链的末尾是不可能的。要么设置了它,要么抛出了异常。如果我们认为以MyClass instance = null开头可能更“安全”,那么我们可能已经隐藏了一个错误。上面的逻辑旨在为每个路径分配一些东西,并且由于规则,即您不能使用不能保证被分配的实例,那么其中的错误将导致编译器错误,并且该错误将很明显。如果将其分配给“占位符” null,那么从头开始,这样的错误将不会立即显现出来,并可能导致错误。

因此,在像裸露声明这样的情况下更好。

但是,尽管如此,总是尽可能避免使用复杂的逻辑,因此那些复杂的链应该很少。在其他情况下,在同一点进行声明和分配的样式意味着您之间没有差错的地方,可能会误入歧途。

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

LeetCode题解圆上任取三点构成锐角三角形的概率

来自字节跳动的一道几何题题解:1/4

LeetCode题解深度优先遍历和回溯的关系?

深度优先遍历的范围更大还是回溯的范围更大?为什么?题解:我的理解是:dfs是回溯思想的一种体现- 回溯:是在整个搜索空间中搜索出可行解,在搜索过程中不断剪枝回退,这是回溯的思想,这个搜索空间并没有限制于特定的数据结构。- dfs:dfs是指特定的数据结构中如图,树(特殊的图)中搜索答案,范围限制在了特定的数据结构。个人拙见。