关于类中StringBuilder类型字段的控制问题

stonemqy 2011-12-26 05:11:10
定义了如下一个类:


public class Class1
{
private StringBuilder m_StringData = new StringBuilder(string.Empty);

public StringBuilder StringData
{
get
{
return m_StringData;
}
}
}



目的是实现对该属性的只读访问,即外部不能改变该属性的值。但是在实际的操作中,却并不能阻止从外部对该属性值的改变。如下:


string temp = "abcde\r\naabbccddffgghh\r\neeffgghh";
Class1 cls1 = new Class1();
cls1.StringData.Append(temp);
Console.WriteLine("Stemp1>> The first cls1.StringData:\r\n{0}", cls1.StringData.ToString());

temp = "AAABBBCCC";
cls1.StringData.Remove(0, cls1.StringData.Length);
cls1.StringData.Append(temp);
Console.WriteLine("Stemp2>> The first cls1.StringData:\r\n{0}", cls1.StringData.ToString());

// 结果:
// Step1>> The first cls1.StringData:
// abcde
// aabbccddffgghh
// eeffgghh
// Stemp2>> The second cls1.StringData:
// AAABBBCCC


此时get访问器形同虚设,请问各位有什么办法解决此为题啊?
...全文
113 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushuai1346 2011-12-27
  • 打赏
  • 举报
回复
恩,这个你可以定义一个方法,然后返回另一个stringBuilder对象,是字段的克隆值.如果需要修改字段,就再定义一些个方法.伪代码哈:
 public class Test
{
private StringBuilder m_StringData = new StringBuilder();

public StringBuilder GetStringData()
{
StringBuilder sbResult = m_StringData.Clone();
return sbResult;
}

public string GetString()
{
return m_StringData.ToString();
}

public void AddItem(string item)
{
m_StringData.Append(item);
}
}
只用不返回原始字段的引用就OK
stonemqy 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yanbuodiao 的回复:]
在你类的内部直接使用哪个私有变量吧m_StringData

在类的外部使用这个属性

C# code


public string StringData
{
get
{
return m_StringData.ToString();
}
}




如果lz的类内部的代码已经都使用了这个封装属性
那你就……
[/Quote]

呵呵呵,谢谢!
烟波钓 2011-12-27
  • 打赏
  • 举报
回复
在你类的内部直接使用哪个私有变量吧m_StringData

在类的外部使用这个属性

public string StringData
{
get
{
return m_StringData.ToString();
}
}



如果lz的类内部的代码已经都使用了这个封装属性
那你就重新暴露给外部一个属性,把StringData属性搞成私有的(很没有必要)
stonemqy 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stonespace 的回复:]
只读的stringbuidler是没有意义的,应该改为string,
[/Quote]

[Quote=引用 5 楼 dalmeeme 的回复:]
设置只读仅限制不能对属性本身赋值,如
cls1.StringData=new StringBuilder();//不允许
cls1.StringData=null;//不允许

但是你可以改变属性(自身也是个对象)的成员,你的代码就是如此。

可以把属性改成string类型。
[/Quote]

嗯,我没有说清楚,我所谓的“只读”的意思是在类的外部无法对该字段的值进行更改,但是在类的内部是可以更改的,因为类中还有其他的一些方法,在这些方法中可以操作这个字段,更改其值。
dalmeeme 2011-12-26
  • 打赏
  • 举报
回复
设置只读仅限制不能对属性本身赋值,如
cls1.StringData=new StringBuilder();//不允许
cls1.StringData=null;//不允许

但是你可以改变属性(自身也是个对象)的成员,你的代码就是如此。

可以把属性改成string类型。
stonespace 2011-12-26
  • 打赏
  • 举报
回复
只读的stringbuidler是没有意义的,应该改为string,

public string StringData
{
get
{
return m_StringData.ToString();
}
}
MJ_dangerous 2011-12-26
  • 打赏
  • 举报
回复
public StringBuilder StringData
{
get
{
return m_StringData;
}
}
实际上就是在得到m_StringData,对象都得到了不就是想一个平常的StringBuilder一样操作啊。如果你要对stringbuilder进行只读操作。那么你定义一个类class A:stringbuilder,改写掉它里面的添加字符串的方法,我不知道有几个,假如就只有Append,直接return就可以了,这样即使调用了append也不会有任何的结果。
tt173221348 2011-12-26
  • 打赏
  • 举报
回复
方法里面可以设置只读属性啊!
特别 2011-12-26
  • 打赏
  • 举报
回复
这两个只读不是同一个意思

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧