理解C#代码并将其移植到Objective-C的帮助

3

好的,我有一个原型,是别人用C#编写的,我现在想把它转换成Objective-C。但是,我还没有正式接触过C#,所以我还不知道它的所有内容。我理解前三个变量是什么意思,但是第四和第五行(c_data)让我遇到了问题。第四行是在声明一个方法吗?第五行是在定义它吗?谢谢你的帮助!

public class c_data {
    public double value;
    public int label;
    public int ID;
    public c_data() { }
    public c_data(double val) {
        value = val;
    }
}

1
那是一些非常令人沮丧的C#代码。我希望在您转换它时,能够更好地命名和格式化。 - Michael Meadows
你告诉我吧。我还有一堆这样的代码需要在一周内转换。安稳睡眠的夜晚早已经逝去,接下来将是彻夜工作! - Josh Bradley
我同意,这可能是来自教科书的例子。这就是为什么很多编程书籍都很糟糕的原因。如果你在真实代码中不会这样做,那就不要教别人在虚假代码中如何做,否则五年后你就会有一堆看起来像你的示例的代码...我在和你说话,Microsoft 和 myStupidPrefix。 - Mike Bethany
7个回答

16

第四行和第五行是 C# 中的构造函数。它们相当于 Objective-C 中 [[c_data alloc] init] 链。C# 允许您基于参数重载构造函数。这相当于在 Objective-C 中拥有两种不同的初始化方法:

@interface CData : NSObject
{
   double value;
   int label;
   int ID;
}

@property double value;
@property int label;
@property int ID;

-(id) init;
-(id) initWithValue:(double)value;

@end

非常感谢...如果不是你,我还会在这里摸索另外一个小时。 - Josh Bradley
将初始化返回类型更改为“id”,并声明扩展NSObject。 - Quinn Taylor
好的回答,特别是从Objective-C移植的角度来看。在移植时遵守目标语言的命名约定(例如,使用“CData”而不是“c_data”作为类名)也是一个好主意。 - Quinn Taylor
当然,C#代码从来没有遵守源语言的约定(它远远超出了命名的范畴)。:( - Michael Meadows
谢谢。我最初排除了一些惯例,以便更容易突出必要的移植差异。但是拥有一个漂亮干净的版本是值得的。我会提到,在某些情况下,如果代码打破惯例可以使您避免全局重命名或重构,则更容易移植。我不知道这是否适用于此情况-但我怀疑OP更有能力做出决定。 - LBushkin

2
第四行是一个无参构造函数,第五行是一个有参构造函数。

2

第一个c_data是默认的无参构造函数,它将结构体的字段初始化为默认值(value -> 0.0,label -> 0,ID -> 0),第二个c_data是构造函数,它将实例的value字段设置为传入的参数val,并将其他字段设置为默认值。我所描述的就是这两个构造函数调用如何初始化实例。


1

第四个和第五个构造函数用于在新建一个c_data实例时进行初始化。


1
第四步是为该类定义一个不带参数且没有操作的构造函数,第五步是为该类定义一个以双精度值作为参数的构造函数,并将类内成员变量值设置为传递的值val。

1

第四行和第五行都是构造函数。

第四行是“默认”构造函数,在这种情况下不初始化任何变量。

第五行的构造函数将名为value的变量设置为传入的参数。


0
如果我可以的话,这有点像在Objective-C类中同时拥有以下两种方法:
  • (id)init;
  • (id)initWithNumber:(NSNumber *)number;
构造函数和初始化器是类似的,只是看起来有点不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接