以前一直以为readonly是一个运行时常量,可以在声明时初始化,也可以在构造函数中初始化,但是一旦初始化完成后便无法改变。但是最近遇到下面的一个事例却可以编译通过,而且通过测试还可以发现DocumentManager下的readonly变量documentQueue 可以通过DocumentManager的方法改变它。这和我理解的只读属性不符,我理解的应该是,既然documentQueue为只读变量,应该不可以被所在类的方法改变。可通过测试可以发现下面的代码确实可行。
public class Document
{
private string title;
public string Title
{
get
{
return title;
}
}
private string content;
public string Content
{
get
{
return content;
}
}
public Document(string title, string content)
{
this.title = title;
this.content = content;
} public override string ToString()
{
return title.ToString() + content.ToString();
}
} public class DocumentManager
{
private readonly Queue<Document> documentQueue = new
Queue<Document>();
public void AddDocument(Document doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public Document GetDocument()
{
Document doc = null;
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
public bool IsDocumentAvailable
{
get
{
return documentQueue.Count > 0;
}
}
}测试代码:将以下代码copy到Main()函数中可以测试上面的代码。 Document testdocument = new Document("for test readonly", "test readonly"); DocumentManager testManger = new DocumentManager();
testManger.AddDocument(testdocument);
Console.WriteLine(testManger.GetDocument().ToString());
Console.ReadLine();
public class Document
{
private string title;
public string Title
{
get
{
return title;
}
}
private string content;
public string Content
{
get
{
return content;
}
}
public Document(string title, string content)
{
this.title = title;
this.content = content;
} public override string ToString()
{
return title.ToString() + content.ToString();
}
} public class DocumentManager
{
private readonly Queue<Document> documentQueue = new
Queue<Document>();
public void AddDocument(Document doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public Document GetDocument()
{
Document doc = null;
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
public bool IsDocumentAvailable
{
get
{
return documentQueue.Count > 0;
}
}
}测试代码:将以下代码copy到Main()函数中可以测试上面的代码。 Document testdocument = new Document("for test readonly", "test readonly"); DocumentManager testManger = new DocumentManager();
testManger.AddDocument(testdocument);
Console.WriteLine(testManger.GetDocument().ToString());
Console.ReadLine();
解决方案 »
- C#正则表达式与JS正则表达式不一样
- 进销存 关于月底 自动结转 求思路
- log4net同一日期有多个日志文件问题
- 判断输入的文字是否含有是小写字母
- 帮忙看下代码错误……
- c#.net 2005 datagrid的应用
- 关于象股票分析软件的图表问题
- 在DataGrid中,當我選中一行後,按DEL鍵能刪除它,但我想抓住此事件,在按DEL時會有一個提示信息,該怎麼辦?
- 如何实现记录按首字母进行分类显示?
- 为什么我不能Debug Web application,紧急!立即给分!
- C#里多线程问题,怎样在开始一个线程的时候给线程方法传参数,即启动带参数的线程??
- 关于Type类中GetField()函数 问题
{
documentQueue = new Queue<Document>(); // XXX
}