Dlaczego listy list1Instance
i p
w metodzie Main
z poniższego kodu wskazują na tę samą kolekcję?Jak zrobić IEnumerable <T> readonly?
class Person
{
public string FirstName = string.Empty;
public string LastName = string.Empty;
public Person(string firstName, string lastName) {
this.FirstName = firstName;
this.LastName = lastName;
}
}
class List1
{
public List<Person> l1 = new List<Person>();
public List1()
{
l1.Add(new Person("f1","l1"));
l1.Add(new Person("f2", "l2"));
l1.Add(new Person("f3", "l3"));
l1.Add(new Person("f4", "l4"));
l1.Add(new Person("f5", "l5"));
}
public IEnumerable<Person> Get()
{
foreach (Person p in l1)
{
yield return p;
}
//return l1.AsReadOnly();
}
}
class Program
{
static void Main(string[] args)
{
List1 list1Instance = new List1();
List<Person> p = new List<Person>(list1Instance.Get());
UpdatePersons(p);
bool sameFirstName = (list1Instance.l1[0].FirstName == p[0].FirstName);
}
private static void UpdatePersons(List<Person> list)
{
list[0].FirstName = "uf1";
}
}
Czy możemy zmienić to zachowanie bez zmiany typu zwrotu na List1.Get()
?
Dzięki
Ale możesz odrzucić dowolne 'IEnumerable' z powrotem na 'T []', 'List ', lub jakikolwiek jest on w rzeczywistości i modyfikować jego elementy (same, a nie ich właściwości). –
Shimmy
@Shimmy Jeśli mamy uzyskać informacje techniczne na temat tego, co możesz * możesz * zrobić, możesz również użyć refleksji, aby uzyskać dostęp do prywatnych członków klasy i robić, co chcesz. Tylko dlatego, że * możesz * zrobić coś (np. Rzucić 'IEnumerable' do jego rzeczywistego typu) nie oznacza, że ** zawsze ** powinien. – Alex
'IEnumerable' nie jest w gruncie rzeczy zbiorem tylko do odczytu. –
Shimmy