我们应该在将变量设置为null之前检查变量是否为null吗?
if (MyBills != null)
{
MyBills = null;
}
Run Code Online (Sandbox Code Playgroud)
例如,在Java相关问题中,性能影响很小.这是C#中的情况吗?其他含义?
我创建了以下代码来测试:
var watch = System.Diagnostics.Stopwatch.StartNew();
int iterations = int.MaxValue;
List<int> myBills= null;
for (var i = 0; i < iterations; i++)
{
if (myBills!= null)
{
myBills = null;
}
}
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine(elapsedMs);
Run Code Online (Sandbox Code Playgroud)
在有和没有结果的情况下在rextester上运行它if (myList != null)
如下:
With check Without check
988 941
938 1021
953 987
998 973
1004 1031
Average
976.2 990.6
Run Code Online (Sandbox Code Playgroud)
因此,即使在非受控环境中对其进行测试,性能影响也无关紧要.
Pat*_*man 13
不,没有多大用处.可能检查变量是否为null与将其设置为null一次太多一样昂贵.
如果它是一个属性,后面还有其他逻辑,那么之前测试它是有意义的,但这实际上应该是属性中逻辑的责任,而不是代码.
除了property/setter参数之外,我在你提供的代码中看不出任何逻辑上的原因.
但是,如果要在将对象设置为null之前对该对象执行额外操作,则有意义:
if (MyBills != null)
{
MyBills.Dispose();
MyBills = null;
}
Run Code Online (Sandbox Code Playgroud)
或执行一些其他操作,如记录结果.
但是这两个示例都在您提供的示例代码之外.
因为人们似乎在质疑我的第一个例子的用例,所以这是一个.这将阻止多次调用Dispose
导致ObjectDisposedException
.
public class MyClass : IDisposable
{
private SomeDisposableObject _disposableObject;
//Some code
public void Dispose()
{
if (_disposableObject != null)
{
_disposableObject.Dispose();
_disposableObject = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经执行了一些计时并发现了以下结果:
valueClass with null check = 1361
nullClass with null check = 1173
valueClass with no null check = 1208
nullClass with null check = 1148
正如您在没有空检查时所看到的那样,它稍微快一点,但对于任何重要的优化都不够.此外,我在调试模式下从编译器执行了这些时序,并关闭了优化,因此它们不是100%准确/相关.
但是,当我在发布模式下运行时,在编译器外部启用了优化,结果非常接近,检查与否则更加可以忽略不计.
和测试代码:
using System;
namespace NullCheckTest
{
class Program
{
const int iterations = 10000000;
static void Main(string[] args)
{
MyClass valueClass = new MyClass() { Value = 10 };
MyClass nullClass = null;
Console.WriteLine($"valueClass with null check = {TestNullCheck(valueClass)}");
Console.WriteLine($"nullClass with null check = {TestNullCheck(nullClass)}");
Console.WriteLine($"valueClass with no null check = {TestNoNullCheck(valueClass)}");
Console.WriteLine($"nullClass with no null check = {TestNoNullCheck(nullClass)}");
Console.ReadLine();
}
static long TestNullCheck(MyClass myClass)
{
MyClass initial = myClass;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
for (int i = 0; i < iterations; ++i)
{
sw.Start();
if (myClass != null)
{
myClass = null;
}
sw.Stop();
myClass = initial;
}
return sw.ElapsedMilliseconds;
}
static long TestNoNullCheck(MyClass myClass)
{
MyClass initial = myClass;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
for (int i = 0; i < iterations; ++i)
{
sw.Start();
myClass = null;
sw.Stop();
myClass = initial;
}
return sw.ElapsedMilliseconds;
}
}
public class MyClass
{
public int Value { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
265 次 |
最近记录: |