C# 新类对象-保留旧值

C# 新类对象-保留旧值,c#,C#,我已经做了3-4年的C语言了,但我从来没有真正使用过类系统,因为我从来没有真正需要它 但现在我的项目已经到了可以从中受益的地步。所以我开始创建并使用一个 所以我有一个内部构造函数,它接受2个参数,比如字符串,它将它们存储在内部构造函数外部的私有字符串中 然后我新建了我的类str1,str2;并使用其所有其他公共方法。e、 g..StartBenchmark 奇怪的是,如果我有一个私有字符串thisMustAlwaysStartAs=ThisString123456789; 在构造函数中将其更改为

我已经做了3-4年的C语言了,但我从来没有真正使用过类系统,因为我从来没有真正需要它

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

所以我有一个内部构造函数,它接受2个参数,比如字符串,它将它们存储在内部构造函数外部的私有字符串中

然后我新建了我的类str1,str2;并使用其所有其他公共方法。e、 g..StartBenchmark

奇怪的是,如果我有一个私有字符串thisMustAlwaysStartAs=ThisString123456789; 在构造函数中将其更改为changed123

当我创建新的MyClass时,我希望它总是以ThisString123456789开头,但它已经更改了123,但我创建了一个全新的实例

对于e.x,构造函数代码如下所示,因此您创建了一个实例,然后创建了另一个实例,您将得到两个MessageBox弹出窗口,第一个是以字符串开头的,第二个不是,但这是怎么回事

MessageBox.Show(thisMustAlwaysStartAs);
thisMustAlwaysStartAs="changed123";
注: MyClass没有实现IDisposable,所以我永远不会处理它,但这不重要,对吧? thisMustAlwaysStartAs字符串就是一个例子,它实际上不是一个字符串,它是一个CancellationTokenSource,如果我取消它,并创建一个新实例,它将创建为已取消。这是否可能是因为CancellationTokenSource是可识别的,这意味着当我完成它时,我将使用它?我知道这是可行的,但当我创建一个新的MyClass时,我假设它本质上创建了一个全新的CancellationTokenSource实例,而不是从MyClass的另一个实例重用一个实例

我对每件事都理解正确吗

问题1:为什么CancellationTokenSource即使我新建MyClass并从新实例进行检查,也会将其IsCancellationRequested设置为true

问题2:如果是因为我必须处理CancellationTokenSource,即使我正在创建一个全新的MyClass,为什么

问题3:如果问题2是正确的,我是否应该为MyClass创建一个IDisposable实现,并从中处置CancellationTokenSource,然后在using中使用MyClass

如果我有什么遗漏或完全错误的地方,请告诉我

给我们看看代码 如果我执行CancellationTokenSource=new CancellationTokenSource,则不会出现此messagebox问题;在内部Lazy的开始时,Q1:CancellationTokenSource为什么即使我新建MyClass并从新实例进行检查,也会将其IsCancellationRequested设置为true

因为它是静态的,这意味着,对于new创建的每个对象的所有实例,只有一个CancellationTokenSource实例,它们之间只有一个IsCancellationRequested共享值。 每个对象都为非静态成员获取自己的值,例如,每个对象都有一个非共享的停止值

问题2:如果是因为我必须处理CancellationTokenSource,即使我正在创建一个全新的MyClass,为什么

不,这和处理无关,因为它是静态的

问题3:如果问题2是正确的,我是否应该为MyClass创建一个IDisposable实现,并从中处置CancellationTokenSource,然后在using中使用MyClass

不管Q2是否正确,您的类确实应该实现IDisposable来处置它所拥有的对象,比如CancellationTokenSource实例,即它们是非静态成员的情况

我猜CancellationTokenSource在这个类上不应该是静态的


有关静态的教程,请参阅,非静态类中的第二节静态成员适用于这种情况。

向我们展示代码…@ZoharPeled Done…您的CancellationTokenSource是静态的。。。您可以有100个实例,它将使用相同的实例,因为它是静态的。@MaDude静态字段是在类的所有实例之间共享的字段。-这就是static关键字所做的,使字段在所有实例之间共享。@MaDude我真的不明白,如果不知道这些基本的东西,你怎么能在c上工作3-4年。我认为阅读一本好的oop/c教程可能已经过时了。
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