我在一个框架中工作,它迫使我创建一个带有默认构造函数的类的实例,所以不幸的是,我不能使用'readonly`‘并将参数传递给字段。
创建实例后,我计划立即通过公共属性设置字段,除非有更合适的方法。
是否可以强制该字段仅在其设置后才被读取?而不在属性集中使用布尔值或某些计数器逻辑?
使用一些伪代码进行更新
public class SomeClass
{
public Create()
{
object = Framework.CreateClass<NeedArgument>();
object.mustSet = value
伙计们!你能告诉我,我们如何使用注释初始化字段吗?例如:我们几乎没有自定义类: Foo;Bar。在主修课上,我们输入了两个字段
public class Main {
Foo foo;
Bar bar;
}
我想要创建注释,这有助于初始化这些字段。最后,我想看到这样的结果:
@Initialize
Foo foo;
@Initialize
Bar bar;
我想让我的类成为不可变的。显而易见的方法是将所有字段声明为get; private set;,并在构造函数中初始化所有字段。因此客户端必须在构造函数中提供所有内容。问题是,当有大约10个或更多的字段在构造函数中传递它们时,会变得非常不可读,因为每个字段都没有标签。
例如,这段代码可读性很好:
info = new StockInfo
{
Name = data[0] as string,
Status = s,
LotSize = (int)data[1],
ISIN = data[
有一种简单的方法可以使实例不可变吗?
让我们举个例子,我有一个类包含了很多数据字段(只有数据,没有行为):
class MyObject
{
// lots of fields painful to initialize all at once
// so we make fields mutable :
public String Title { get; set; }
public String Author { get; set; }
// ...
}
创造的例子:
MyObject CreationExample(String somePar
我知道当使用自动属性时,编译器会在屏幕后面创建自己的支持字段。然而,在我为了学习而阅读的许多程序中,我看到人们明确地写道
private int _backingField;
public int Property { get { return _backingField; } }
上面和下面有什么区别?
public int Property { get; private set; }
我知道当你在getter或setter中有副作用时,使用这个属性是很明显的,但通常情况并非如此。另外,我知道你必须在结构中显式地使用支持字段,你不能通过属性来访问它们的成员。
我所能找到的唯一区别是,在定义
在C#中创建字段readonly的目的是什么?
它实际上似乎并不能阻止字段的修改:
public struct Struct
{
public readonly int Value;
public Struct(int value)
{
this.Value = value;
}
}
static class Program
{
static void Main()
{
var s = new Struct(1);
Debug.Assert(s.Value == 1, "Read-only
如下所示,用户能够更改只读产品字段/属性:
class Program
{
static void Main(string[] args)
{
var product = Product.Create("Orange");
var order = Order.Create(product);
order.Product.Name = "Banana"; // Main method shouldn't be able to change any
你好,我对只读字段和私有getter属性之间的区别感到非常困惑。我见过人们在他们的代码中同时使用这两种方法,但我就是不明白它们的不同之处。 private readonly int num = 0;
// or //
private int Num
{
get { return num; }
} 那么,使用这两种方法中的任何一种是不同的,还是根据某人的偏好而定呢?我仍然是C#的初学者&我有一些使用python的经验,所以如果这是一个愚蠢的问题,很抱歉。:-)
我在一个公共静态类中有以下代码:
public static class MyList
{
public static readonly SortedList<int, List<myObj>> CharList;
// ...etc.
}
。。但即使使用readonly,我仍然可以将其他类中的项添加到列表中:
MyList.CharList[100] = new List<myObj>() { new myObj(30, 30) };
或
MyList.CharList.Add(new List<myObj>() { new m
大家都知道JMM的这个特性,有时对对象的引用可以在该对象的构造函数完成之前接收值。
在最终字段语义中,我们还可以读到:
final字段的使用模型是一个简单的模型:在该对象的构造函数中为一个对象设置final字段;不要在对象的构造函数完成之前在另一个线程可以看到该对象的地方写入对正在构造的对象的引用。如果这样做,那么当对象被另一个线程看到时,该线程将始终看到该对象的final字段的正确构造版本。(1)
在JLS中,下面的示例演示了如何不保证初始化非最终字段(1示例17.5-1.1) (2)
class FinalFieldExample {
final int x;
我有一个下一个代码:
struct T
{
public T(int u)
{
this.U = 10; //Errors are here
}
public int U { get; private set; }
}
C#编译器在声明的行中给出了两个错误: 1)自动实现的属性'TestConsoleApp.Program.T.U‘的后备字段必须完全赋值,然后才能将控制权返回给调用方。考虑从构造函数初始值设定项调用默认构造函数。2)在'this‘对象的所有字段都赋值给之前,不能使用该对象
我做错了什么?帮我理解一下。
我有一个名为Employees的不可变类,如下所示:
public final class Employees {
private final List<Person> persons;
public Employees() {
persons = new LinkedList<Person>();
}
public List<Person> getPersons() {
return persons;
}
}
如何使这个类保持不变?
我创建了字段private和final,并且没有
这是声明不可变结构的正确方式吗?
public struct Pair
{
public readonly int x;
public readonly int y;
// Constructor and stuff
}
我想不出为什么这会遇到问题,但我只是想问一下,以确保。
在本例中,我使用了In。如果我使用一个类来代替,但是这个类也是不可变的,会怎么样呢,像这样?这应该也很好用,对吧?
public struct Pair
{
public readonly (immutableClass) x;
public readonly (immutabl
我正在尝试一些让我印象非常普遍的东西,但我正在努力寻找实现它的好方法。
我创建了一个'Tag‘类,如下所示:
Public Class Tag
Public Name As String
Private Server As Server
...
End Class
标记是在运行时创建的,所以对我来说是有意义的。但是,这些标记存储在服务器上,定义如下:
Public Class Server
Public Name As String
Public Location As Location (<- An Enum)
...
End C
我感兴趣的是创建一个具有不可修改属性的不可变类,以及一个从它派生的可变类。这些对象将是表示数据库记录的简单数据对象,因此它们只具有不可变值的属性。
我的目标是让我的数据访问层正常创建对象的可变版本,方法是根据数据库值设置属性,但将这些对象的只读版本传递回应用程序。(如果开发人员真的想这样做,代码可以显式地将不可变对象转换回可变对象,这一点我可以接受。)
我可以使用setter和setter的方法,并为可变类创建一个公共的新setter,这样就很难看了(这是一个单词吗?)
public class ImmutableClient {
private int _clientId;
我试图弄清楚如何能够成功地更改“只读”数组。下面的代码成功运行,但我很困惑为什么取消对私有/只读数组的引用是合法的,如下所示:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.Time[5] = 5; // Why is this legal? How can I make it illegal?
}
}
public class M