我想将下面的cert变量设为const?当我这样做时,我得到一个错误,“分配给cert的表达式必须是一个常量”。我在网上看到过一些文章要求将其转换为静态只读而不是const,并且还说要成为const,应在编译时知道其值。
我有两个问题
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IAMAGoodDeveloper
{
public class MyFactory
{
public KeyGen GenerateKeyProvider()
{
return new KeyGen();
}
}
public class KeyGen
{
public int GetKey(string arg)
{
return 1;
}
}
}
MyFactory.cs
{{1}}
答案 0 :(得分:2)
const
是编译时关键字,它将用已编译代码中的硬编码值替换所有对您的const变量的引用
public class MyClass
{
private const int MyNumber = 2;
public void MyMethod()
{
Console.WriteLine(MyNumber);
}
}
编译后,结果代码如下所示:
public class MyClass
{
public void MyMethod()
{
Console.WriteLine(2);
}
}
它将被编译为IL,但是您明白了。
这意味着您只能将在编译时已知且属于C#基本对象的东西标记为常量,例如字符串,整数,十进制等。
不幸的是,变量当前不允许readonly。但是,有人在谈论使https://www.infoq.com/news/2017/04/CSharp-Readonly-Locals
成为可能答案 1 :(得分:1)
您不能使用const
。您可以认为const
不太像变量,而更像是在编译时用值替换所有实例的宏。它只能与字符串和基元一起使用。
您只能将readonly
与字段一起使用,而不能与局部变量一起使用。也许应该允许,但不允许。
答案 2 :(得分:1)
我明白了您为什么想要这样的东西,基本上等于JavaScript和TypeScript中的const
或Kotlin中的val
。
A,C#没有此功能,不幸的是const
不能那样工作。
您可以这样做:
namespace IAMAGoodDeveloper
{
public static class Program
{
private static readonly int cert;
static void Main(string[] args)
{
var myFactory = new MyFactory();
var secretsProvider = myFactory.GenerateKeyProvider();
cert = secretsProvider.GetKey("arg");
}
}
}
答案 3 :(得分:0)
执行此操作时,出现错误,“分配给cert的表达式必须为常量”。
忽略您想要的内容,并查看c#为 const 值提供的限制:const (C# Reference)。
常量可以是数字,布尔值,字符串或空引用。
我不知道还能告诉您什么,您根本无法使用实例化的对象。
现在,创建一个稍微安全的 readonly 对象的另一种方法是只公开一个接口:
public class MyFactory
{
public IKeyGen GenerateKeyProvider()
{
return new KeyGen();
}
public interface IKeyGen
{
int GetKey(string arg);
}
private class KeyGen : IKeyGen
{
public int GetKey(string arg)
{
return 1;
}
}
}
由于您尚未包含此对象的任何用法,因此除了您不希望对象本身发生更改之外,很难确定其他任何内容。
答案 4 :(得分:0)
不能将const与实例化对象一起使用。 一个不错的选择是在类级别使用静态只读字段。