2011-01-26 2 views
6

확장 메서드를 처음 사용하고 무엇을 할 수 있는지 탐색했습니다.C# 확장 메서드 - 호출 개체를 반환합니다.

호출 개체를 특정 할당없이 출력에 할당 할 수 있습니까? 특별히 지정하지 않고 "Hello World! Extended!" 발생하는 foo.ExtensionTest()를 얻을 수있는 방법이있다 .. 다음 예

public static string ExtensionTest(this string input) 
{ 
    return input + " Extended!"; 
} 

...

var foo = "Hello World!"; 

var foo2 = foo.ExtensionTest(); // foo2 = "Hello World! Extended!" 

foo.ExtensionTest(); // foo = "Hello World!" 

foo = foo.ExtensionTest(); // foo = "Hello World! Extended!" 

: 여기

설명하는 간단한 예는 foo = foo.ExtensionTest()

+0

소리는 정적 메서드 호출 현장에'이 ref' 수정을 찾고있는 것처럼 'foo.Extension();'과 같이 보입니다. 불행히도이 언어에는 현재이 기능이 없습니다. 아마도 언어 디자이너에게 추천할만한 것이 있습니까? :) 개인적으로, 나는 그것을 원하지 않을 것입니다. – Ani

+3

@ 아니 : 하하, 안돼! 오, 이런 일이 일어날 것이라고 상상할 수 있니? 'string bar = foo; foo.DoSomething(); Console.WriteLine (ReferenceEquals (bar, foo));'... (출력 :'False', 개발자 : * WHAAAT?!? *) –

+1

@Dan Tao : 정확합니다. 귀하의 모든 심판은 정적 방법에 속합니다. – Ani

답변

13

아니요,하지만 작동하지 않는 이유는 문자열의 불변성과 확장 방법과는 관련이 없습니다.

public class SomeClass 
{ 
    public int Value {get; set;} 
} 

그리고 확장 방법 : .NET에서

var someClass = new SomeClass{ Value = 1 }; 
someClass.DoIt(); 

Console.WriteLine(someClass.Value); //prints "2" 
+0

나는 XmlNodes 및 XmlDocuments에서 실제로이 작업을 수행하려고합니다. 일반적인 질문에 대한 예제가 더 간단했습니다 (생각했습니다!). – Shevek

5

표시되는 내용은 문자열을 변경할 수없는 경우입니다.

어떤 경우에도 객체를 변경하려면 이 지정되어 있습니다.

+0

나는 이것을 XmlNodes와 XmlDocuments에서 실제로하고 싶다. 이것은 일반적인 질문에 대한 더 간단한 예이다. – Shevek

4

'this'매개 변수는 참조가 아닌 값으로 전달됩니다. 따라서, 확장 메소드에서 'this'에 의해 앨리어스 된 호출 프로그램의 변수를 수정할 수 없습니다.

1

번호 문자열 :

public static void DoIt(this SomeClass someClass) 
{ 
    someClass.Value++; 
} 

이의 효과가겠습니까 당신이 클래스를 가지고 대신하는 경우

불변. 모든 public String 메소드는 String의 새로운 인스턴스도 리턴합니다.

5

당신이 (이상한 것이다)는 out 매개 변수를 적용하고 반환 값으로 그것을 사용하는 것이 얻을 수있는 가장 가까운 :

public static void ExtensionTest(this string input, out string output) 
{ 
    output = input + " Extended!"; 
} 

예 :

string foo = "Hello World!"; 
foo.ExtensionTest(out foo); 

재미있는를 그것에 관해서는 더 자세히 말하지만, 과 비슷합니다. 실제로 입력하는 것이 조금 더 많습니다.

명확하게하기 위해 : 당신이 메서드 호출의 종류를 만들기 위해하는 것이 정말 중요하지 않는 한 내가 할 이 권장하지. 다른 개발자가 "WTF?" 그것을 볼 때 100 %와 같은 것이되어야합니다.

+0

+1 매우 고약한 :) – leppie

+0

나는 이것을 좋아한다! 그것은 게시 된 질문에 따라 좋은 해결 방법입니다. 좋은 직업 +1 – VoodooChild

1

확장 메서드 내에서 변수에 새 값을 할당하려면 C# 컴파일러에서 확장 메서드에서 허용하지 않는 ref 수정자가 필요합니다 (어쨌든 나쁜 생각 일 수 있습니다). 변수를 변경하는 것이 분명하도록하는 것이 좋습니다.

0

가변 문자열에 대해서는 더 빠른 StringBuilder를 사용하고 ref or out keyword을 지적하십시오. StringBuilder는 기본적으로 문자열에 대한 향상된 연결 목록입니다.
변경 불가능한 문자열은 C 언어 및 다른 많은 언어에 긴밀한 동작을 허용하는 디자인 결정이었습니다.

string str = "foo"; 

str += "bar"; // str will be free for garbage collection, 
//creating a new string object. 
//Note: not entirely true in later C# versions. 

StringBuilder sb = new StringBuild(); 
sb.Append("foo"); 
sb.Append("bar"); // appends object references to a linked list. 

은 참조 :