C#-使用可空类型作为参数

C#-使用可空类型作为参数,c#,.net,performance,garbage-collection,C#,.net,Performance,Garbage Collection,有人能告诉我,接受函数的可为null的参数,然后在使用后将参数设置为null是否是一个好主意吗?这是释放未使用资源的好编程实践吗?例: public static bool SendEmail(MailAddressCollection? To, string Subject, string Body) { // use the values stored in To, Subject, and Body to send the message. To = null; } 不,

有人能告诉我,接受函数的可为null的参数,然后在使用后将参数设置为null是否是一个好主意吗?这是释放未使用资源的好编程实践吗?例:

public static bool SendEmail(MailAddressCollection? To, string Subject, string Body)
{
    // use the values stored in To, Subject, and Body to send the message.
    To = null;
}

不,不是。你有一个GC来帮你处理。您不使用非托管语言,您不需要处置资源(当然,除非它们是
IDisposable

不,在.NET等托管环境中,这是一种不好的做法。 NET中的垃圾收集器可以自动收集没有引用的对象,并从中释放内存

但也有少数例外。您可以手动将引用设置为null并显式调用GC:

public static void ForceGC(ref object obj) {        
    obj = null;
    GC.Collect();
}

不,这不是个好主意。你所做的没有实际影响唯一设置为null的变量是该方法的局部变量。无论如何,该变量将自动超出范围

相反,如果将该对象作为参数,则意味着在当前方法之外有一个对该对象的引用,并且您不会影响该引用。因此,在方法内部执行任何操作都不会帮助GC。在这方面产生任何非局部影响的唯一方法是将所有参数作为
ref
传递,从而能够将传递的变量设置为null。然而,这将是绝对可怕的,因为每个看似无辜的方法调用都有可能破坏以后假定为非null的引用


通常,在大多数应用程序中,您应该做的不是思考它。GC在检测未使用内存方面做得更好,因为它可以检查堆栈中的引用,并且可以访问JIT编译器发出的、您看不到的相关元数据。

1)
string?
不是有效类型。2) GC会帮你处理的。别担心,垃圾收集器会处理的。关于GC的更多信息我不是指字符串。我只是用我写的函数作为例子来说明我的意思。我宁愿使用可选参数sendmail(string subject=“default subject”,string body=“default body)我刚刚注意到,在您的示例中,
To
必须是
null
类型,其中
MailAddressCollection
必须是
struct
。因此,
To
是一种值类型。如果是这样,
To
不受
GC
的约束,除非您将其框在某个地方。接下来,将
null
赋值给
To
不是一种选择引用赋值,但默认值
Nullable
的赋值。因此,您不应该考虑
GC
,因为
To
值存在于堆栈中,并在方法结束时立即销毁(如果jitter决定,则更早)。我已经更新了代码,以便更准确地表示我的问题。这种强制对象集合的方法是无用的。首先,如果对对象的一个引用为空,则并不意味着其他任何地方都没有引用(例如,立即调用方方法的调用方)第二,调用GC.Collect以收集一个对象是导致大量性能问题的直接途径,因为垃圾收集总是检查所有对象,因此成本很高。一般建议是在任何时候都避免强制GC。