单例模式在C#中赋值

时间:2013-08-18 02:18:18

标签: c# singleton

我正在尝试更改我的代码并实现单例设计模式

我有一个名为Room

的课程
protected Room()
{

}

public static Room Instance()
{
    if (_instance == null)
    {
        _instance = new Room();
    }
    return _instance;
}

public char room { get; set; }

现在我想从主类

中分配一些值
Room myRm = Room.Instance(); 

List<Room> myRoom = new List<Room>();
char[] RoomArray = new char[] { 'A', 'B', 'C', 'D' };               
foreach (char c in RoomArray)
{
    var theroom = myRm.room = c;
    myRoom.Add(theroom); <-----------does not allow me to add some
}

我收到这两个错误

  

最佳重载方法匹配   System.Collections.Generic.List<ASR2.Room>.Add(ASR2.Room)有一些   无效的参数

     

C:\项目\ C-尖锐\分配1 \ ASR3 \ ASR3 \ Asr.cs

     

参数1:无法从'char'转换为   'ASR2.Room'C:\ Project \ c-sharp \ Assignment1 \ Asr3 \ Asr3 \ Asr.cs

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

作为试图帮助解决即时编译问题的其他答案的补充,这个答案将解释其他问题。

我相信你让单身人士与工厂方法混淆。 Singleton 意味着该类是静态的,或者只在应用程序的整个生命周期中实例化一次,并且只实例化一次。 Factory 方法是一个函数,例如Room.GetNewRoom(),它将始终返回Room对象的新实例。

目前,您正在调用Room.Instance()始终将返回创建的Room对象( aka,Singleton )的同一实例在第一个电话。但是,在循环内部,您将在每次迭代时为该单个对象的room属性分配不同的值!

这意味着在循环结束时,Room的单个现有实例将只包含循环中的最后一个值。


现在,解决问题。我认为您正在寻找的是 Factory 方法。在您的代码中,我收集您要调用static函数,该函数将返回一个全新的Room对象。

应该如下所示:

public static Room NewRoom()
{
    var result = new Room();
    // do things with result
    return _result;
}

最后,你的循环应如下所示:

foreach (char c in RoomArray)
{
    var theroom = Room.NewRoom();
    theroom.room = c;
    myRoom.Add(theroom);
}

答案 1 :(得分:1)

您正尝试将char添加到Room个对象的列表中,因为这行:

var theroom = myRm.room = c;

cchar

不确定,您的意图是什么,但如果您想要一个房间列表,请将您的代码更改为:

myRoom.Add(myRm);

但是这会给你一个Room的同一个实例的列表,这个实例不太有用。

我认为你需要重新思考你的架构并解释为什么你认为你需要一个单身人士。单身人士名单毫无用处。

答案 2 :(得分:0)

从这一行:

var theroom = myRm.room = c;

因此,theroom的类型为Char。

以下行是:

myRoom.Add(theroom);

由于myRoom的类型为List<Room>,因此您无法添加theroom,因为theroom是字符,而不是Room。由于无法将Char隐式转换为Room,您将收到错误消息:

cannot convert from 'char' to 'ASR2.Room'