Рассмотрим класс с именем StringExtensions
следующим образом:
static class StringExtensions {
public static string Truncate(this string value, int maxChars) {
return value.Length <= maxChars ?
value :
value.Substring(0, maxChars) + " ..";
}
}
Убедитесь, что в любое пространство имен, в которое вы помещаете этот класс, вы включаете объявление using
для этого пространства имен.
Таким образом, для полного примера:
StringExtensions.cs
:
namespace My.Extensions {
static class StringExtensions {
public static string Truncate(this string value, int maxChars) {
return value.Length <= maxChars ?
value :
value.Substring(0, maxChars) + " ..";
}
}
}
Program.cs
:
using System;
using My.Extensions;
namespace My.Program {
static class Program {
static void Main(string[] args) {
string s = "Hello, World";
string t = s.Truncate(5);
Console.WriteLine(s);
Console.WriteLine(t);
}
}
}
Кстати, вы не добавляете его в.СЕТЬ.Вы даже не добавляете новый метод в класс String
.Скорее, это трюк компилятора, который заставляет статические методы жить в статических классах с их первым параметром, объявленным как this *TypeName* *valueParameter*
, где *TypeName*
- это имя типа, а *valueParameter*
- это имя параметра, которое может быть отображено какметод экземпляра для экземпляров типа с именем типа *TypeName*
.То есть
string t = s.Truncate(5);
переводится компилятором в
string t = StringExtensions.Truncate(s, 5);