这可能是有史以来最愚蠢的问题,但我认为这对新手来说完全是一个混乱.
String不可改变的?StringBuilder比首字母和副词更受欢迎?一个很好的例子(在Java中)将非常感激.
我正在创建一个不可变的类.
我已将所有属性标记为只读.
我有一个课程列表.
虽然如果属性是只读的,则可以修改列表.
公开列表的IEnumerable使其不可变.
我想知道为了使一个类不可变而必须遵循的基本规则是什么?
在C#中,匿名类型的属性是只读的:
var person = new { Surname = "Smith", OtherNames = "John" };
person.Surname = "Johnson"; // ERROR: .Surname is read-only
Run Code Online (Sandbox Code Playgroud)
当然,如果我想要可写字段或属性,我可以声明一个真正的类,但不管怎样,这个设计决策背后的原因是什么使属性成为只读?
我想用Tupleclass来存储我程序中需要的2个整数信息(StartAddress,EndAddress).
但我发现Tuple项是ReadOnly,所以如果我需要为一个项设置一个值,我需要重新实例化一个元组.
这个设计决定背后的原因是什么?
我已经找到了一个很好的Builder模式示例(在C#中),但找不到一个,因为我不了解Builder模式或者我正在尝试做一些从未打算过的事情.例如,如果我有一个抽象的汽车和抽象的构建方法来创建汽车零件,我应该能够将我所有的30个选择发送给Director,让它构建我需要的部件,然后构建我的汽车.无论生产哪种汽车,卡车,半卡车等,我都应该能够以完全相同的方式"驾驶"它.
第一个问题是大多数示例硬编码属性值到具体部分,我认为应该来自数据库.我认为这个想法是将我的选择发送给Director(来自数据源),并让构建器根据我的数据创建自定义产品.
第二个问题是我希望构建器方法实际创建部件然后将它们分配给产品,而不是传递字符串,而是真正的强类型产品部件.
例如,我想通过为我创建一个Builder制作表单字段来动态创建表单,包括标签,输入部分,验证等.这样我可以从我的ORM中读取对象,检查对象的元数据,将其传递给我的Builder并将新创建的用户控件结果添加到我的Web表单中.
但是,我找到的每个Builder示例都只有硬编码数据,而不是将选择从主代码传递到Builder并开始定制产品.一切似乎都是一个很大的静态案例陈述.例如,如果我有三个参数,每个参数有10个选项,我不想构建30个具体的Builder方法,我想创建的只是足以制作我的产品所需的属性,可能只有三个.
我很想让Director只存在于主代码中.应该有一种方法可以自动确定调用哪个具体的构建器方法,类似于多态和方法重载(尽管这是一个非常糟糕的例子),而不是在模式中使用case语句.(每次我需要添加新的产品类型时,我都需要修改现有的Director,这很糟糕).
请考虑以下代码(我有意将 MyPoint编写为此示例的引用类型)
public class MyPoint
{
public int x;
public int y;
}
Run Code Online (Sandbox Code Playgroud)
它是普遍公认的(至少在C#中)当你通过引用传递时,该方法包含对被操作对象的引用,而当你通过值传递时,该方法复制被操纵的值,因此全局范围中的值是不受影响.
例:
void Replace<T>(T a, T b)
{
a = b;
}
int a = 1;
int b = 2;
Replace<int>(a, b);
// a and b remain unaffected in global scope since a and b are value types.
Run Code Online (Sandbox Code Playgroud)
这是我的问题; MyPoint是引用类型,所以我希望在相同的操作Point,以取代a与b在全球范围内.
例:
MyPoint a = new MyPoint { x = 1, y = 2 };
MyPoint b = new …Run Code Online (Sandbox Code Playgroud) c# value-type reference-type pass-by-reference pass-by-value
我已经使用以下代码在类中实现了IEquatable接口.
public bool Equals(ClauseBE other)
{
if (this._id == other._id)
{
return true;
}
return false;
}
public override bool Equals(Object obj)
{
if (obj == null)
{
return base.Equals(obj);
}
if (!(obj is ClauseBE))
{
throw new InvalidCastException("The 'obj' argument is not a ClauseBE object.");
}
return Equals(obj as ClauseBE);
}
public override int GetHashCode()
{
return this._id.GetHashCode();
}
public static bool operator ==(ClauseBE a, ClauseBE b)
{
// cast to object so we call the overloaded Equals function …Run Code Online (Sandbox Code Playgroud) public class HourlyForecastData
{
public DateTime DateTime { get; private set; }
public decimal TemperatureCelcius { get; private set; }
public decimal DewPoint { get; private set; }
public string Condition { get; private set; }
public int ConditionCode { get; private set; }
public int WindSpeed { get; private set; }
public string WindDirection { get; private set; }
public decimal WindDegrees { get; private set; }
public int UltravioletIndex { get; private set; }
public decimal Humidity { …Run Code Online (Sandbox Code Playgroud) 我有一个可变类型的类属性的私有setter,我通过类构造函数使用 myMutableVariable.
但是当我改变某些东西时myMutableVariableafter Class.Property = myMutableVariable,它们之间存在差异myMutableVariableand Class.Property.
例如,Changin将myVariable设置为null.
该物业仍然private- 不会改变.即使对于同一私有属性中的列表及其成员也是如此.
这是如何运作的?
public class Class1
{
public Class1(string name)
{
this._name = name;
}
private string _name = "";
public string Name { get { return _name; } set { _name = value; } }
}
public class Class2
{
public Class2(Class1 c1)
{
this._c1 = c1;
}
private Class1 _c1;
public Class1 C1 { get { return _c1; } }
}
Run Code Online (Sandbox Code Playgroud)
考试:
static …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×2
immutability ×2
.net-4.0 ×1
builder ×1
c#-3.0 ×1
iequatable ×1
java ×1
oop ×1
readonly ×1
string ×1
tuples ×1
value-type ×1