草庐IT

c# - 只读结构在数组中时是否应该是不可变的?

(注意:此示例代码需要C#7.2或更高版本,以及NugetSystem.Memory程序包。)假设我们有一个只读结构,如下所示:publicreadonlystructTest{publicTest(intvalue){Value=value;}publicintValue{get;}}现在让我们把它放到一个数组中:vararray=newTest[]{newTest(1)};Console.WriteLine(array[0].Value);//Prints1到目前为止一切顺利。您不能编写代码直接修改array[0].Value。现在假设我们这样做:array.AsSpan().As

c# - 类型 'T' 必须是不可为 null 的值类型才能将其用作泛型类型或方法 'T' 中的参数 'System.Nullable<T>'

为什么我在以下代码中会收到此错误?voidMain(){int?a=1;int?b=AddOne(1);a.Dump();}staticNullableAddOne(Nullablenullable){returnApplyFunction(nullable,(intx)=>x+1);}staticNullableApplyFunction(Nullablenullable,Funcfunction){if(nullable.HasValue){Tunwrapped=nullable.Value;TResultresult=function(unwrapped);returnnewNu

c# - 在显式构造函数之外初始化字段是不好的做法吗

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:Initializeclassfieldsinconstructororatdeclaration?我们正在争论编码实践。这里的例子有点太简单了,但真正的交易有几个构造函数。为了初始化简单值(例如,将日期设置为最小值),我已将代码从构造函数中移出并移入字段定义中。publicclassConstructorExample{string_string="John";}publicclassConstructorExample2{string_string;publicConstructorExample2(){

c# - 这个测试名称是不是有点过头了

如题所示,这个测试名是不是有点顶了?WhenChargeIsGreaterThanRestingChargeButLessThanChargeRestApproachStep_OnUpdate_ChargeIsSetToRestingCharge有什么改进建议吗?还是就这样好了?下面是完整的测试夹具,因此您可以获得一些上下文:)publicclassNeuronTests{[Fact]publicvoidOnUpdate_NeuronFiresWhenChargeIsEqualToThreshold(){Neuronneuron=newNeuron();boolfired=false;

c# - 使用 "base"是不好的做法,即使它可能有利于可读性?

我知道这是一个主观问题,但我一直对编码风格的最佳实践感到好奇。ReSharper4.5在实现类中的基方法调用之前就关键字“base”发出警告,即base.DoCommonBaseBehaviorThing();虽然我很欣赏“少即是好”的心态,但我也花了很多时间调试/维护高度链接的应用程序,并且觉得仅通过查看就知道成员调用是对基础对象的可能会有所帮助在它。当然,更改ReSharper的规则很简单,但你们怎么看?调用基成员时应该使用“base”吗? 最佳答案 唯一应该使用base.MethodCall();的情况是子类中有一个重写的同名

c# - 为什么 Font 是不可变的?

字体不可变让程序员和GC都感到苦恼,因为您每次都需要创建一个新实例。为什么Font是不可变的引用类型? 最佳答案 它简化了渲染系统的使用。如果框架允许Font可变,则需要检测变化,并定期修改其呈现方式。由于Font创建了一个本地资源,保持这个不可变可以防止系统担心必须在内部重复地重新创建句柄。此外,我不同意“程序员的苦恼”。通过使Font不可变,它使用户创建Font对象时发生的事情更加明显。如果你想要一个新的Font,你需要创建一个新的Font对象,这又会创建新的原生字体资源。使Font不可变可以更清楚地了解正在发生的事情-您不太可

c# - 如何判断一个字符串是不是xml?

我们有一个可以包含XML或纯文本的字符串字段。XML不包含header,并且没有根元素,即格式不正确。我们需要能够编辑XML数据,清空元素和属性值,仅保留它们的名称,因此我需要在编辑之前测试该字符串是否为XML。目前我正在使用这种方法:stringredact(stringeventDetail){stringdetail=eventDetail.Trim();if(!detail.StartsWith(""))returneventDetail;...有没有更好的方法?这种方法是否会遗漏任何边缘情况?感谢我可以使用XmlDocument.LoadXml并捕获XmlException,

c# - "fluent"(或可链接)方法必须是不可变的吗?

假设我有一个具有一些属性和一些用于操作这些属性的方法的类:publicclassPersonModel{publicstringName{get;set;}publicstringPrimaryPhoneNumber{get;set;}publicvoidLoadAccountInfo(AccountInfoaccountInfo){this.Name=accountInfo.Name;}publicvoidLoadPhoneInfo(PhoneInfophoneInfo){this.PrimaryPhoneNumber=phoneInfo.PhoneNumber;}}典型的用法是:v

c# - 在 C# 中,值类型是可变的还是不可变的?

值类型的行为表明我们持有的任何值都不能通过其他变量更改。但我仍然对我在这篇文章的标题中提到的内容感到困惑。谁能解释一下? 最佳答案 值类型可以是可变的或(模数一些奇怪的边缘情况)不可变的,这取决于您如何编写它们。可变的:publicstructMutableValueType{publicintMyInt{get;set;}}不可变的:publicstructImmutableValueType{privatereadonlyintmyInt;publicImmutableValueType(inti){this.myInt=i;}

c# - 不变的还是不可变的?

好吧,据我所知,不可变类型本质上是线程安全的,或者我在很多地方都读过,我想我明白为什么会这样。如果实例的内部状态在创建对象后无法修改,那么对实例本身的并发访问似乎没有问题。因此,我可以创建以下List:classImmutableList:IEnumerable{readonlyListinnerList;publicImmutableList(IEnumerablecollection){this.innerList=newList(collection);}publicImmutableList(){this.innerList=newList();}publicImmutable