关于C#:nsstring*mystring和nsstring*mystring有什么区别

What is the difference between NSString* mystring and NSString *mystring

我遇到过几个例子,它们在头中声明类的方式不同,比如

1
NSString* mystring;

1
NSString *mystring;

有什么区别?


这是三个完全不同的词汇元素,它们之间的空白量完全无关。就编译器生成的内容而言,这些都是等效的:

1
2
3
4
5
6
NSString*x;
NSString *x;
NSString* x;
NSString * x;
NSString                 *                 x;
NSString /* comment here */ * /* and another */ x;

我更喜欢NSString *x变体,因为指针说明符属于变量,而不是类型。我的意思是这两个:

1
2
int *x, y;
int* x, y;

创建一个名为x的整数指针和一个名为y的整数,而不是两个整数指针。


没有区别。这是风格问题。

在objective-c中,你几乎可以把星看作变量"类型"的一部分。

但是,编译器将星解释为"将此变量视为指向声明类型的指针"(在本例中为nsstring)。有趣的是一次定义多个变量:

1
NSString *myString, *yourString;

必须在每个变量上使用星号。


是首选项,如果在同一行中声明多个变量,则非常有用,即

1
2
3
NSString* mystring1, mystring2;  // Misleading, mystring2 is not a *

NSString *mystring1, mystring2;  // Is more clear

没有区别。这是一个偏好和风格的问题。

  • 这里有一个类型为NSString指针(NSString* mystring)的变量。
  • 这里有一个类型为NSString的变量,它是一个指针(NSString *mystring)
  • 第一种方法的优点:

    当编码到协议时,有些变量有一个星,而有些没有。例子:

    1
    2
    NSString*        _myString
    id<SomeProtocol> _collaborator

    与(更混乱的)相比:

    1
    2
    NString          *_myString
    id<SomeProtocol> _collaborator

    这种方法的缺点:(如所指出的)

    1
    2
    //Only the first is a pointer.
    NSString* _myString, _anotherString

    现代的OO语言(如Java)倾向于阻止一行上的多个变量:http://java.xun.com /DOCS/CODECONV/HTML/CODECONVIENDOCT.DOC5.html 2991。


    没什么-这是一个个人偏好,关于你是否认为…

  • 这里有一个nsstring指针类型的变量(NSString* mystring)

  • 这里有一个nsstring类型的变量,它是一个指针(NSString *mystring)

  • …更清晰。也就是说,只要你始终如一,你就不应该放松睡眠。


    在c(和objective-c,作为c的超集)中,*的位置仅仅是样式问题。

    我建议从谷歌的风格指南中查看相关部分。


    现实中没有区别。


    没什么,在他们之间留出空间甚至都不重要。你甚至可以写NSString*mystring


    没有区别,只是编码样式偏好。