为什么在C#初始化对象之前分配null

时间:2015-03-11 14:00:48

标签: c#

我正在关注如何使用Windows Phone上的Windows MediaCapture API使用捕获视频的教程,以及代码示例,在分配新实例之前,一些变量设置为null。

private void InitCaptureSettings() {
    _captureInitSettings = null;
    _captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
    _captureInitSettings.AudioDeviceId = "";
    _captureInitSettings.VideoDeviceId = "";
    _captureInitSettings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.AudioAndVideo;
    _captureInitSettings.PhotoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.VideoPreview;

    if (_deviceList.Count > 0) {
        _captureInitSettings.VideoDeviceId = _deviceList[0].Id;
    }
}

为什么要这样做有什么理由?

由于

3 个答案:

答案 0 :(得分:9)

执行此操作的唯一点是,如果MediaCaptureInitializationSettings构造函数可以抛出异常,并且您希望确保在这种情况下变量仍然没有引用到一个“旧”的对象。根据我的经验,这很少有用。 (如果像这样的方法抛出异常,我会尽量避免使用它正在初始化的对象......)

我建议使用对象初始化器完成所有这些操作:

_captureInitSettings = new MediaCaptureInitializationSettings
{
    AudioDeviceId = "",
    VideoDeviceId = _deviceList.Count > 0 ? _deviceList[0].Id : "",
    StreamingCaptureMode = StreamingCaptureMode.AudioAndVideo,
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview
};

这有两个好处:

  • 这是更简单的代码,IMO ......更不用说重复了
  • 如果整个对象初始化程序完成,它只设置变量的值。如果设置一个属性失败,则最终不会引用对半初始化对象的引用。

答案 1 :(得分:1)

我认为将新构造的类的所有字段设置为一些众所周知的默认值是一种好习惯。

为什么?

首先它是基本的"代码卫生"。

第二:虽然在一个只展示构造函数的小例子中没有多大意义,但想象一下这个类的字段在稍后阶段被修改的场景。如果在此修改期间出现问题,即抛出异常,则可能会使您的班级处于不良状态。

答案 2 :(得分:0)

在你的例子中,我们无法判断它是否有用。

您正在做的是将MediaCaptureInitializationSettings的当前实例设置为NULL,然后创建MediaCaptureInitializationSettings的新实例。

您设置为NULL的变量不会影响新实例。