关于C#:类方法和实例方法之间的区别?

Difference between class methods and instance methods?

当我在编程中使用实例方法和类方法时,我总是搞混了。请告诉我实例方法和类方法的区别以及它们之间的优点。


所有其他的答案似乎都被错误的标签发现了,这个标签现在已经被修正了。

在Objective-C中,实例方法是当消息发送到类的实例时调用的方法。例如:

1
2
3
id foo = [[MyClass alloc] init];
[foo someMethod];
//   ^^^^^^^^^^   This message invokes an instance method.

在Objective-C中,类本身就是对象,而类方法只是在消息发送到类对象时调用的方法。即

1
2
[MyClass someMethod];
//       ^^^^^^^^^^   This message invokes a class method.

请注意,在上面的示例中,选择器是相同的,但因为在一种情况下,它被发送到MyClass的实例,而在另一种情况下,它被发送到MyClass,所以会调用不同的方法。在接口声明中,可以看到:

1
2
3
4
5
6
7
8
@interface MyClass : NSObject
{
}

+(id) someMethod;  // declaration of class method
-(id) someMethod;  // declaration of instance method

@end

在实施过程中

1
2
3
4
5
6
7
8
9
10
11
12
@implementation MyClass

+(id) someMethod
{
    // Here self is the class object
}
-(id) someMethod
{
    // here self is an instance of the class
}

@end

编辑

对不起,错过了第二部分。没有这样的优点或缺点。这就像是在问"当"和"如果"之间的区别,以及两者之间的优势是什么。这有点毫无意义,因为它们是为不同的目的而设计的。

类方法的最常见用法是在需要实例时获取实例。+alloc是一个类方法,它为您提供了一个新的非初始化实例。nsstring有很多类方法,可以为您提供新的字符串,例如+stringwithforma

另一个常见的用途是获得单子,例如

1
2
3
4
5
6
7
8
9
+(MyClass*) myUniqueObject
{
    static MyUniqueObject* theObject = nil;
    if (theObject == nil)
    {
        theObject  = [[MyClass alloc] init];
    }
    return theObject;
}

上面的方法也可以作为实例方法使用,因为对象是静态的。但是,如果将其作为类方法,并且不必首先创建实例,那么语义就更清晰了。


如果我们不想创建类的对象,那么我们使用类方法如果我们想通过类的对象调用方法,那么我们使用实例方法


我不知道我们是否可以谈论任何优势,这是一个相当于你正在实施的问题。

实例方法应用于类的实例,因此它们需要应用对象,并且可以访问调用方的成员:

1
2
Foo bar;
bar.instanceMethod();

另一方面,类方法应用于整个类,它们不依赖任何对象:

1
Foo::classMethod();

正如大多数其他答案所说,实例方法使用类的实例,而类方法只能与类名一起使用。在目标C中,它们被定义为:

1
2
3
4
5
6
@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

然后可以这样使用它们:

1
2
3
4
5
6
// class methods must be called on the class itself
[MyClass aClassMethod];

// instance method require an instance of the class
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

类方法的一些实际例子是许多基础类的便利方法,如EDCOX1、1的EDOCX1、2或EDCOX1、3的EDCOX1、4、4。实例方法是NSArray-count方法。


实例方法使用类的实例,而类方法只能与类名一起使用。+符号在类方法之前使用,其中as single desh(-)在实例变量之前使用。

1
2
3
4
5
6
@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

它们也可以这样使用,

1
2
3
4
[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

或者另一个例子是:

[

1
2
3
4
NSString string]; //class method

NSString *mystring = [NSString alloc]init];
[mystring changeText]; //instance Method

类方法用于类,但实例方法用于该类的对象,即实例

1
2
3
4
5
6
//Class method example
className *objectName = [[className alloc]init];
[objectName methodName];

//Instance method example
[className methodName];


读一读静态关键字,它几乎涵盖了它。

MSDN:http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx

谷歌搜索:http://www.google.ch/search?aq=f&sourceid=chrome&ie=utf-8&q=static+keyword+c%2b%2b


静态成员函数被非正式地称为类方法(不正确)。在C++中没有方法,有成员函数。