我从事C#已有3-4年了,但是我从来没有真正因为使用Class系统而感到烦恼。
但是现在我的项目已经到了可以从中受益的地步。因此,我开始创建和使用一个。
所以我有一个internal
构造函数,它接受2个参数(让我们说字符串),并将它们存储在内部构造函数外部的私有字符串中。
然后我new MyClass("str1", "str2");
并使用其所有其他公共方法。 (例如.StartBenchmark()
)
如果我有private string thisMustAlwaysStartAs="ThisString123456789";
,这很奇怪
(在构造函数中更改为changed123
;
当我new MyClass()
期望thisMustAlwaysStartAs
以ThisString123456789
开头时,它已经changed123
了,但是我创建了一个全新的实例吗?
(对于ex构造函数代码如下,因此您创建1个实例,然后再创建另一个实例,您将获得2个MessageBox弹出窗口,第一个是字符串开头,第二个不是字符串开头,但是那怎么办? )
MessageBox.Show(thisMustAlwaysStartAs);
thisMustAlwaysStartAs="changed123";
注意:
MyClass没有实现IDisposable,所以我从不丢弃它,但这没关系吧?
thisMustAlwaysStartAs
“字符串”是一个示例,它实际上不是字符串,它是CancellationTokenSource,如果我将它取消()并创建一个新实例,它将创建为已取消。这是否可能是由于CancellationTokenSource是IDisposable的意思,意思是我完成后Dipose
的意思?我知道这可以工作,但是当我创建一个新的MyClass时,我假设它实际上是创建了一个全新的CancellationTokenSource实例,而不是从另一个MyClass实例中重用。
我是否正确理解所有内容?
问题1:为什么即使我新建MyClass()并从新实例中进行检查,CancellationTokenSource仍将其IsCancellationRequested
设置为true?
问题2:如果是因为我必须Dispose()
CancellationTokenSource即使我要创建一个全新的MyClass()也是为什么?
第3季度:如果第2季度是正确的,我应该为MyClass和Dispose
CancellationTokenSource创建一个IDisposable实现,并在using()中使用MyClass吗?
如果我有任何缺失或完全错误的地方,请告诉我!
namespace NotEveryQuestionNeedsExamples {
class Lazy {
private static CancellationTokenSource CancellationTokenSource = new CancellationTokenSource();
public bool Stopped => CancellationTokenSource.Token.IsCancellationRequested;
internal Lazy() {
if(Stopped) { MessageBox.Show("This shouldn't show up"); }
CancellationTokenSource.Cancel();//This will make Stopped return true
}
}
}
Testing:
new Lazy();
new Lazy();
//If you got ANY messagebox, then CancellationTokenSource somehow got the .IsCancellationRequested from the first Lazy() instance
如果我在CancellationTokenSource = new CancellationTokenSource();
的开头执行internal Lazy()
,就不会出现此消息框问题
答案 0 :(得分:1)
问题1:为什么即使我新建MyClass()并从新实例中进行检查,CancellationTokenSource仍将其IsCancellationRequested设置为true?
因为它是static
,所以对于所有实例(每个由new
创建的对象)来说,CancellationTokenSource
实例只有一个({{1仅一个值) }})之间共享。
对于非静态成员,每个对象都会获得其自身的值(例如,每个对象都具有IsCancellationRequested
的非共享值)。
问题2:如果是因为我必须Dispose()CancellationTokenSource,即使我正在创建全新的MyClass(),为什么?
不,与此处处理无关,因为它是Stopped
第3季度:如果第2季度正确,我应该为MyClass创建一个IDisposable实现并从中处理CancellationTokenSource并在using()中使用MyClass吗?
不管Q2是不正确的,您的类都应该真正实现 以处置其拥有的对象,例如static
的实例,即它们是非静态成员。
我猜IDisposable
不应该在此类课程上CancellationTokenSource
有关静态的教程,请参见C# - Static,第二部分非静态类中的静态成员适用于这种情况。