新类对象-保留旧值

时间:2018-10-22 05:21:00

标签: c#

我从事C#已有3-4年了,但是我从来没有真正因为使用Class系统而感到烦恼。

但是现在我的项目已经到了可以从中受益的地步。因此,我开始创建和使用一个。

所以我有一个internal构造函数,它接受2个参数(让我们说字符串),并将它们存储在内部构造函数外部的私有字符串中。

然后我new MyClass("str1", "str2");并使用其所有其他公共方法。 (例如.StartBenchmark()

如果我有private string thisMustAlwaysStartAs="ThisString123456789";,这很奇怪 (在构造函数中更改为changed123

当我new MyClass()期望thisMustAlwaysStartAsThisString123456789开头时,它已经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(),就不会出现此消息框问题

1 个答案:

答案 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,第二部分非静态类中的静态成员适用于这种情况。