Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Явная имплементация всегда статична. Она не может быть переписана (override) или перекрыта (new) в классах-потомках.Не вполне верно. Явная имплементация по сути может быть переписана в классе-потомке, если тот же самый интерфейс реализовать еще раз. При этом используется другой механизм, нежели override, но результат аналогичен.
interface A { void Foo(); }
class B : A { void A.Foo() {} } // Явная реализация
class C : B, A { void A.Foo() {} } // Аналог overide в виде еще одной явной реализации
Явная имплементация всегда приватна (private).В C# — да, явная реализация всегда приватна (точнее, она всегда private virtual sealed). Но статья все-таки называется «Немного об интерфейсах в .Net» — а в других языках этого семейства это не так. Я говорю о MSIL и C++/CLI. В этих языках при реализации интерфейса реализующий метод может иметь любой модификатор доступа и имя:
public interface class A {
void Foo();
};
public ref class B : A {
protected:
virtual void Bar() = A::Foo {}
};
для foreach необходима имплементация не IList, а IEnumerableНеверно. Для foreach необходимо наличие открытого метода GetEnumerator в классе или в одном из интерфейсов, возвращающего объект или структуру, у которого есть открытые метод bool MoveNext() и доступное для чтения свойство Current. Этот механизм позволяет в некоторых случаях (например, при итерации списков) создавать итератор не в куче, а на стеке.
struct EmptyEnumerable
{
public EmptyEnumerator GetEnumerator() { return new EmptyEnumerator(); }
}
struct EmptyEnumerator
{
public bool MoveNext() { return false; }
public object Current { get { throw new InvalidOperationException(); } }
}
class Test
{
public void Run()
{
foreach (var q in new EmptyEnumerable())
throw new InvalidOperationException();
Console.WriteLine("Hello, world!");
}
}
Для foreach необходимо наличие открытого метода GetEnumerator в классе или в одном из интерфейсов, возвращающего объект или структуру, у которого есть открытые метод bool MoveNext() и доступное для чтения свойство Current. Этот механизм позволяет в некоторых случаях (например, при итерации списков) создавать итератор не в куче, а на стеке.
Я тоже редко читаю на русском (и использую слово имплементация в устной речи), но если пишешь для русской аудитории, лучше писать корректным языком, как мне кажется.
Пожалуй, правильнее всего использовать вариант Microsoft
array реализует интерфейс IList. Ведь IList — это в первую очередь методы Add() и Remove(). Поэтому логично было ответить, что array не реализует интерфейс IList. Add(), Clear(), Remove(), RemoveAt(), Insert()) им не поддерживаются. IList<>, то очевидно, что я хочу в этом методе использовать методы специфичные именно для этого интерфейса (в противном случае я бы использовал параметр IEnumerable<>). А так получается есть возможность без проверки передать массив в качестве такого параметра, чтобы потом в рантайме вылезла ошибка NotSupportedException.Представляет коллекцию объектов, доступ к которым может быть получен отдельно, по индексу.Где здесь вообще сказано про изменяемость? Все изменяющие методы — опциональны.
using System;
using System.Linq;
namespace TestArrayInForeach
{
class Program
{
static void Main(string[] args)
{
var array = args.Select(int.Parse).ToArray();
var arrayLength = array.Length;
// First case
for (var index = 0; index < array.Length; index++)
{
Console.WriteLine(array[index]);
}
// Second case
foreach (int item in array)
{
Console.WriteLine(item);
}
// Third case
for (var index = 0; index < arrayLength; index++)
{
Console.WriteLine(array[index]);
}
}
}
}
{
Console.WriteLine(array[index]);
00000092 mov eax,dword ptr [ebp-8]
00000095 mov edx,dword ptr [ebp-1Ch]
00000098 cmp eax,dword ptr [edx+4]
0000009b jb 000000A2
0000009d call 79033254
000000a2 mov ecx,dword ptr [edx+eax*4+8]
000000a6 call 048F4D90
for (var index = 0; index < array.Length; index++)
000000ab inc dword ptr [ebp-8]
000000ae mov eax,dword ptr [ebp-8]
000000b1 mov edx,dword ptr [ebp-1Ch]
000000b4 cmp eax,dword ptr [edx+4]
000000b7 jl 00000092
000000c7 mov eax,dword ptr [ebp-14h]
000000ca mov edx,dword ptr [ebp-20h]
000000cd cmp eax,dword ptr [edx+4]
000000d0 jb 000000D7
000000d2 call 79033254
000000d7 mov eax,dword ptr [edx+eax*4+8]
000000db mov dword ptr [ebp-0Ch],eax
{
Console.WriteLine(item);
000000de mov ecx,dword ptr [ebp-0Ch]
000000e1 call 048F4D90
000000e6 inc dword ptr [ebp-14h]
foreach (int item in array)
000000e9 mov eax,dword ptr [ebp-14h]
000000ec mov edx,dword ptr [ebp-20h]
000000ef cmp eax,dword ptr [edx+4]
000000f2 jl 000000C7
}
{
Console.WriteLine(array[index]);
000000fc mov eax,dword ptr [ebp-10h]
000000ff mov edx,dword ptr [ebp-1Ch]
00000102 cmp eax,dword ptr [edx+4]
00000105 jb 0000010C
00000107 call 79033254
0000010c mov ecx,dword ptr [edx+eax*4+8]
00000110 call 048F4D90
for (var index = 0; index < arrayLength; index++)
00000115 inc dword ptr [ebp-10h]
00000118 mov eax,dword ptr [ebp-10h]
0000011b cmp eax,dword ptr [ebp-4]
0000011e jl 000000FC
int s = 0;
for (int z1 = 0; z1 < array.Lenght; z1++)
{
s += array[z1];
}
и foreach (var i in array)
{
s += i;
}
int c = array.Length;
for (int z1 = 0; z1 < c; z1++)
{
s += array[z1];
}
foreach (var y in x)
Console.WriteLine(y);
int[] array = x;
for (int i = 0; i < array.Length; i++)
{
int y = array[i];
Console.WriteLine(y);
}
А с другой будет увеличение времени компиляции и размера сборки.
.NET Senior Developer зарабатывает столько, на сколько он сможет договориться :)Извините, но это чушь.
По поводу зарплат — что Вас не устраивает? В Германии нет тарифной сетки для работающих в частных структурах, поэтому зарплата Senior Developer полностью зависит от того, насколько он договорится с работодателем — и эта зарплата может колебаться в 2-3 раза в зависимости от фирмы, земли и места работы…От земли — может быть. Остальное ерунда, т.к. зарплата полностью подчиняется закону рынка. И, таким образом, при условии, что «Senior Developer» это некий стандарт, то все такие программисты со временем будут работать в одном месте — там где зарплата в 3 раза выше. Либо везде будет примерно одинаковая зарплата.
я и преподаю .Net как MCTТогда я не понимаю, как вы могли не знать, что Array реализует IList`1, что Count это свойство ICollection`1 и ICollection, и про explicit interface implementation? — Про это и пишет GrigoryPerepechko
Вы же утверждаете, что для Вас это все было обыденным знанием и все наследование Вы всегда можете его воспроизвести «от зубов»?Я этого нигде не утверждал.
Тем не менее, даже формально когда-то заучив это для сертификаций и преподавания я, честно признаюсь, не понимал что речь в данном случае идет о explicit implementation, и именно осознание этого факта показалось мне достаточно интересным для статьи.Это элементарно, Ватсон.
Тем не менее, даже формально когда-то заучив это для сертификаций и преподавания я, честно признаюсь, не понимал что речь в данном случае идет о explicit implementation, и именно осознание этого факта показалось мне достаточно интересным для статьи.В этом и проблема: вы их заучили, а я это знаю, потому что с этим работаю.
Неужели Вы никогда не видели вакансии «зарплата по результатам собеседования»?Не знаю как у вас в Германии, а в России за этой фразой обычно прячут неприлично низкую зарплату. У кого высокие зарплаты — не скрывают суммы.
А уже несколько раз пытаюсь Вам сказать, что это — не «некий стандарт», это скорее описание позиции, где (практически) с первого дня ожидается работа над продуктивным кодом и где никто не настроен сначала тебя обучать тем технологиям, с которыми нужно работать.
Поэтому Senior Developer получает столько, насколько он договорился в интервью.1. Я прекарсно осознаю что значит Senior .NET Developer. 2. Между первой и второй фразой нет никакой связи. 3. Работодатель заранее знает, сколько он будет платить кандидату — так называемая «вилка».
Немного об интерфейсах в .Net (по мотивам одного интервью)