Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从方法返回对对象的常量引用? public Item getItem(ulong itemId) { 项目=项目[itemId] 退货项目; }_C#_Constants_Return Value - Fatal编程技术网

C# 如何从方法返回对对象的常量引用? public Item getItem(ulong itemId) { 项目=项目[itemId] 退货项目; }

C# 如何从方法返回对对象的常量引用? public Item getItem(ulong itemId) { 项目=项目[itemId] 退货项目; },c#,constants,return-value,C#,Constants,Return Value,现在的问题是:getItem的被调用方必须能够检索item保存的信息;但不要修改它 对不起,我知道C++比C语言好。恐怕我必须回到一个微小的C++,而只是为了弄清楚我正在努力实现什么…这就是我在C++中所做的: const Item&getItem(未签名的长itemId) { const Item&Item=items[itemId]; 退货项目; } 很好-现在调用getItem的人可以调用item上的getter,但不能调用setter 我需要在C#中获得类似的结果。。。有可能吗?您可以

现在的问题是:
getItem
的被调用方必须能够检索
item
保存的信息;但不要修改它

对不起,我知道C++比C语言好。恐怕我必须回到一个微小的C++,而只是为了弄清楚我正在努力实现什么…这就是我在C++中所做的:
const Item&getItem(未签名的长itemId)
{
const Item&Item=items[itemId];
退货项目;
}
很好-现在调用
getItem
的人可以调用
item
上的getter,但不能调用setter


我需要在C#中获得类似的结果。。。有可能吗?

您可以使用接口仅显示getter,同时仍然支持实现接口的类中的setter。只要返回接口,任何使用者都将仅限于接口定义的getter

public interface IItem {
    string SomeProperty { get; }
}

public class Item : IItem {
    public string SomeProperty { get; set; }
}

public class ItemHandler {
    private Item _item = new Item();

    public IItem getItem() {
        _item.SomeProperty = "A Value";
        return _item;
    }
}

class Program {
    static void Main(string[] args) {
        var itemHandler = new ItemHandler();
        var item = itemHandler.getItem();

        // You can read the property
        Console.WriteLine(item.SomeProperty);

        // You can't write to the property
        //item.SomeProperty = "A New Value";
    }
}

这取决于
Item
class
还是
struct
。是否有任何东西阻止您更改
以使属性为只读?如果需要,您可能应该使用一个不带设置器的新对象,例如
ReadOnlyItem
,它包装
,不带设置器。@RonBeyer或返回项实现的接口,该接口仅公开getters以确保完整性(以防万一还不清楚):C#对C++的“常量正确性”没有概念(就这一点而言,大多数其他语言也没有)。对结构的不变性有一些支持,但因为不变性不是结构的目的(使用它们还有其他后果)这不是通常的做法。如果你的代码库确实需要阻止调用方做坏事,那么包装器接口或类就是其他人提到的,但是在很多情况下,C++将使用<代码> const < />代码,C代码库只会“不这样做,那么”。.Wow-非常酷!!!!当然,客户端始终可以强制转换为原始对象并访问setter。
(项作为项)。SomeProperty=“作弊”
是完全合法的,不会出错。我认为OP需要通过设计强制实现不可变性。一般来说,您这样做只是为了保护开发人员不意外地踩到数据。要使其真正不可变,事情变得复杂得多。问题归结为您是否试图指导开发人员或强制执行约束。