修改对对象的引用以避免受保护的二传手

c#

42 观看

2回复

7 作者的声誉

我有一个通用的抽象类,如下所示:

class AbstractClass<T>
{
   public T Data {get; protected set;}
}

在所有情况下,T都是IEnumerable。在大多数情况下,它是一个列表。但是在特殊情况下,T可以是字符串,它是字符的集合。当T为字符串时,允许修改数据的最佳方法是什么?

我的想法是简单地获取Data的值,然后为其分配一个新值。

var data = Obj.Data;
data = "string";

那会满足我的期望吗?有陷阱吗?有没有更好的办法?

编辑:

设置器受保护的根本原因是因为它通常是一个集合,其目的是在构造函数中新建该集合。其次,我可能应该添加了它,Data对象可选地是一个INotifyPropertyChanged。在课程的其余部分中有一些样板代码,但是基本前提是我不想担心跟踪Data通知中的分配。

class Concrete<T> : AbstractClass<T>
{
    public Concrete(T t)
    {
        Data = t;
    }        
}

string str = "String";
Concrete<string> blah = new Concrete<string>(str);
Console.WriteLine(blah.Data); // "String"
string temp = blah.Data;
temp = "Assign";
Console.WriteLine(blah.Data); // "Assign"

我希望最后一行打印“ Assign”,但它打印“ String”。有没有办法在不更改保护的情况下实现这一目标?我正在考虑使用C ++修改地址。

作者: rtkite 的来源 发布者: 2017 年 9 月 15 日

回应 2


0

623 作者的声誉

如果您确实想这样做,可以使用ref关键字。从c#7开始,您还可以ref用于从函数返回值,请参阅:https : //docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref#reference-return-values

但是,仅因为可以,并不意味着您应该这样做。如果必须这样做,则设计可能存在问题。

作者: tmlye 发布者: 2017 年 9 月 15 日

0

87176 作者的声誉

决定

C#string是不可变的,因此您不能像集合一样直接对其进行编辑。

但是,还有其他可用作可变字符串的类。我将使用System.Text.StringBuilder

与其给出一般的参数string,不如给出StringBuilder

string str = "String";
var blah = new Concrete<StringBuilder>(new StringBuilder(str));
Console.WriteLine(blah.Data); // "String"
// to change the string to "Assign", call Clear() then Append()
blah.Data.Clear();
blah.Data.Append("Assign");
Console.WriteLine(blah.Data);
作者: Sweeper 发布者: 2017 年 9 月 15 日
32x32