C# Protobuf:消息字段的默认实例而不是 null?

问题描述 投票:0回答:1

以 c++ 和 python 版本的 protobuf 生成为例,让我们看看以下内容:

message Sub {
  optional int int_val = 1;
}
message Root {
  optional int int_val = 1;
  optional Sub sub_val = 2;
}

在Python中你可以简单地做类似的事情

my_proto = Root()
print(my_proto.sub.int_val)

C++ 中也类似

Root my_proto;
std::cout << my_proto.sub_val().int_val();

但是在 C# 中,这将返回空引用错误

Root myProto = new Root();
Console.WriteLine(myProto.sub_val.int_val);

我的问题是,有没有办法让 protoc 生成器具有默认实例而不是 C# 的 null ?或者一种访问该字段并设置默认值(如果未设置)并返回而不需要太多代码开销的方法?

我尝试初始化所有必要的子字段以避免空引用,但这不能适应更复杂的 protobuf。我尝试过寻找可能的选项来生成,但似乎不是允许此类操作的选项。

类似地,在 https://protobuf.dev/getting-started/csharptutorial/ 中,只有一次使用所有数据进行初始化的选项。即使查看生成的 C# 代码,我们似乎也无法避免空引用,至少使用我使用的选项,因为它们不会专门为未设置的字段生成对象的新实例。

c# protocol-buffers
1个回答
0
投票

我很困惑;为什么需要一个默认实例?这里的项是可选的,可选值可以省略是required,默认省略是expected预计您可以区分存在和不存在的子消息,这是通过

null
测试实现的。漂亮、简单、惯用的 .NET

在我看来,C# 版本做的是正确的事情?

如果您想要一个实例:

var obj = new Root {
    sub_val = new(),
};

(假设使用最新的 C#,否则您需要在

new
中指定类型)

© www.soinside.com 2019 - 2024. All rights reserved.