함수 매개 변수의 "this"
HtmlHelpers에 대한 몇 가지 코드 예제를 살펴보면 다음과 같은 선언이 표시됩니다.
public static string HelperName(this HtmlHelper htmlHelper, ...more regular params )
다른 곳에서는 이런 유형의 구조를 본 기억이 없습니다. 누군가 "this"의 목적을 설명 할 수 있습니까? public static을 선언함으로써 클래스를 인스턴스화 할 필요가 없다고 생각했습니다.이 경우 "this"는 무엇입니까?
C # 3.0의 새로운 기능인 확장 메서드를 선언하는 구문입니다.
확장 메서드는 부분 코드, 부분 컴파일러 "마법"으로, Visual Studio의 인텔리 젠스를 사용하여 컴파일러가 실제로 해당 개체의 인스턴스 메서드로 확장 메서드를 사용할 수 있음을 나타냅니다.
예를 들어 보겠습니다.
GobbleGobble이라는 String 클래스에는 메서드가 없으므로 확장 메서드를 생성 해 보겠습니다.
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
클래스 이름은 내 명명 규칙 일 뿐이며 이름을 그렇게 지정할 필요는 없지만 메서드와 마찬가지로 정적이어야합니다.
위의 메서드를 선언 한 후 Visual Studio에서 다음을 입력 할 수 있습니다.
String s = "Turkey Baster!";
s.
점 다음에 intellisense를 기다렸다가 GobbleGobble 메소드가 있는지 확인하고 다음과 같이 코드를 완성합니다.
String s = "Turkey Baster!";
s.GobbleGobble();
중요 : intellisense가 메서드를 표시하려면 확장 메서드가 선언 된 클래스가 컴파일러 및 intellisense 프로세서에서 사용 가능해야합니다. GobbleGobble을 수동으로 입력하고 Ctrl+ .단축키를 사용하면 파일에 올바른 using 지시문을 가져 오는 데 도움이되지 않습니다.
메서드에 대한 매개 변수가 사라졌습니다. 컴파일러는 다음과 같은 중요한 부분을 조용히 이동합니다.
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
따라서 위의 코드는 컴파일러에 의해 다음과 같이 변환됩니다.
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
따라서 호출 시간에는 마법 같은 것이 없습니다. 단지 정적 메서드를 호출하는 것입니다.
확장 메소드가 둘 이상의 매개 변수를 선언하는 경우 첫 번째 매개 변수 만 this
수정자를 지원 하고 나머지는 정상적으로 메소드 호출의 일부로 지정되어야합니다.
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
확장 메서드는 Linq로 인해 부분적으로 추가되었습니다. 여기서 C #의 Linq 구문은 실행중인 개체에 대해 적절하게 명명 된 확장 메서드를 찾습니다. 즉, 올바른 확장을 선언하여 모든 유형의 클래스에 Linq 지원을 "소개"할 수 있습니다. 행동 양식. 물론 전체 Linq 지원은 많은 작업이지만 가능합니다.
또한 확장 방법 자체가 정말 유용하므로 읽어보십시오.
다음은 몇 가지 링크입니다.
확장 방법 이후 미친 듯이 사용해 왔어요 .. 여기 제가 꾸준히 사용하는 몇 가지 방법이 있습니다 ..
public static T ChangeType<T>(this object obj)
{
return (T)Convert.ChangeType(obj, typeof(T));
}
이렇게 작동합니다 ..
int i = "123".ChangeType<int>();
bool valid = "bool".ChangeType<bool>();
int id = dataSet.Tables[0].Rows[0]["Id"].ChangeType<int>();
예, 모든 단일 객체에 표시되고 성 가실 수 있지만 거의 모든 데이터 유형에 이것을 사용하기 때문에 가능한 모든 데이터 유형에 대해 복제하는 대신 객체에 첨부하는 것이 좋습니다.
public static string ToXml(this object serializableObject)
{
var aMemStr = new MemoryStream();
try
{
var serializer = new XmlSerializer(serializableObject.GetType());
serializer.Serialize(new XmlTextWriter(aMemStr, null), serializableObject);
return Encoding.UTF8.GetString(aMemStr.ToArray());
}
finally { if (aMemStr != null) { aMemStr.Dispose(); } }
}
string xml = dataSet.ToXml();
public static T ToObject<T>(this string xmlString)
{
var aStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString));
try { return (T)new XmlSerializer(typeof(T)).Deserialize(aStream); }
finally { if (aStream != null) { aStream.Dispose(); aStream = null; } }
}
DataSet dataSet = xml.ToObject<DataSet>();
확장 방법에 사용됩니다. 기본적으로 Helpername을 htmlHelper 개체에 '접착'하면 다음과 같이 말할 수 있습니다.
new HtmlHelper().HelperName(...more regular params);
그것은 확장 방법입니다. 원래 클래스 외부에있는 정적 메서드를 통해 클래스를 "확장"할 수 있습니다.
예를 들어, 항상 사용하는 유용한 문자열 방법이 있다고 가정합니다.
public int CountAllAs(string orig)
{
return orig.ToLowerInvariant().ToArray().Count(c => c == 'a');
}
그리고 당신은 그것을 ...
string allAs = "aaaA";
int count = CountAllAs(allAs);
그렇게 나쁘지 않습니다. 그러나 약간만 변경하면 Extension 메서드로 만들 수 있으며 호출이 좀 더 예쁘게됩니다.
public static int CountAllAs(this string orig)
{
return orig.ToLowerInvariant().ToArray().Count(c => c == 'a');
}
그리고 그것을 ...
string allAs = "aaaA";
int count = allAs.CountAllAs();
확장 방법 ...
...are a fantastic way to include functionality like if you where using the decorator pattern, but without the pain of refactoring all your code, or using a different name of a common type.
public static class Extensions
{
public static string RemoveComma(this string value)
{
if (value == null) throw new ArgumentNullException("value");
return value.Replace(",", "");
}
}
So you can use this code, anywhere in you app.
Console.WriteLine(“Hello, My, Friend”.RemoveComma())
>> Hello My Friend
So the this command attribute mean the type that the extension will be “added”, and let you work with the value as if it was passed as parameter.
참고URL : https://stackoverflow.com/questions/3045242/this-in-function-parameter
'developer tip' 카테고리의 다른 글
PHP에서 설정을 해제하기 전에 var가 있는지 확인하십시오. (0) | 2020.10.11 |
---|---|
인터페이스를 사용하는 이유는 무엇입니까? (0) | 2020.10.11 |
객체를 사전에 매핑하거나 그 반대로 매핑 (0) | 2020.10.11 |
Mustache 템플릿에서 후행 쉼표없이 쉼표로 구분 된 목록을 표현하는 우아한 방법이 있습니까? (0) | 2020.10.11 |
모든 EditText에 일관된 스타일 설정 (예 :) (0) | 2020.10.11 |