Davranış, Array.Resize
.NET yöntemine son derece benzer . Neler olup bittiğini anlamak için,.
jetonun C, C ++, Java, C # ve Swift'de .
C'de bir yapı, değişkenlerin toplanmasından başka bir şey değildir. .
Bir yapı türünün değişkenine uygulanması, yapı içinde depolanan bir değişkene erişecektir. Nesneye işaretçiler , değişkenlerin toplanmasını tutmaz , onları tanımlar . Birinin bir yapıyı tanımlayan bir işaretçisi varsa,->
operatör işaretçi tarafından tanımlanan yapı içinde saklanan bir değişkene erişmek için kullanılabilir.
C ++ 'da, yapılar ve sınıflar yalnızca değişkenleri toplamakla kalmaz, aynı zamanda bunlara kod da ekleyebilir. Kullanımı .
bir değişkene hareket etme bu yöntemi soracaktır bir yöntemi çağırmak için değişkenin kendisi içeriğine üzerine ; ->
bir nesneyi tanımlayan bir değişken üzerinde kullanılması , bu yöntemin değişken tarafından tanımlanan nesne üzerinde hareket etmesini ister .
Java'da, tüm özel değişken türleri nesneleri tanımlar ve bir değişkenin üzerine bir yöntem çağırmak, yönteme değişken tarafından hangi nesnenin tanımlandığını bildirir. Değişkenler herhangi bir bileşik veri türünü doğrudan tutamaz veya bir yöntemin çağrıldığı bir değişkene erişebilmesi için herhangi bir yol yoktur. Bu kısıtlamalar, anlamsal olarak sınırlansa da, çalışma zamanını büyük ölçüde basitleştirir ve bayt kodu doğrulamasını kolaylaştırır; bu tür basitleştirmeler, piyasanın bu tür sorunlara duyarlı olduğu bir zamanda Java'nın kaynak yükünü azaltmış ve böylece pazarda çekiş sağlamasına yardımcı olmuştur. Ayrıca .
, C veya C ++ 'da kullanılana benzer bir jetona ihtiyaç olmadığı anlamına da geliyorlardı . Her ne kadar Java başka bir amaçla gerekmediğinden kullanmış olabilir .->
, C ve C ++ ile aynı şekilde , içerik oluşturucular tek karakterli.
C # ve diğer .NET dillerinde, değişkenler nesneleri tanımlayabilir veya bileşik veri türlerini doğrudan tutabilir. Bileşik veri türünde bir değişken üzerinde kullanıldığında, değişkenin içeriğine.
etki eder ; bir referans tipi değişkeni üzerinde kullanıldığında, tanımlanan nesneye etki eder.
onun tarafından. Bazı işlemler için semantik ayrım özellikle önemli değildir, ancak diğerleri için önemlidir. En sorunlu durumlar, bileşik veri tipinin çağrıldığı değişkeni değiştirecek yönteminin salt okunur bir değişken üzerinde çağrıldığı durumlardır. Salt okunur bir değer veya değişken üzerinde bir yöntem çağrılmaya çalışılırsa, derleyiciler genellikle değişkeni kopyalar, yöntemin buna göre hareket etmesine izin verir ve değişkeni atar. Bu genellikle yalnızca değişkeni okuyan yöntemlerle güvenlidir, ancak ona yazılan yöntemlerle güvenli değildir. Ne yazık ki, .does henüz hangi yöntemlerin bu tür bir ikame ile güvenle kullanılabileceğini ve hangilerinin kullanılamayacağını gösteren herhangi bir araca sahip değildir.
Swift'te, toplamalar üzerindeki yöntemler, çağrıldıkları değişkeni değiştirip değiştirmeyeceklerini açıkça belirleyebilir ve derleyici, salt okunur değişkenler üzerinde mutasyon yöntemlerinin kullanılmasını yasaklar (daha sonra değişkenin geçici kopyalarını mutasyona uğratmak yerine) atılmalıdır). Bu ayrım nedeniyle, .
çağrıldıkları değişkenleri değiştiren çağrı yöntemlerini kullanmak için Swift'te .NET'ten çok daha güvenlidir. Ne yazık ki, aynı .
tokenin bir değişken tarafından tanımlanan harici bir nesneye etki etmek için kullanılması, karışıklık olasılığı anlamına gelir.
Bir zaman makinesi varsa ve C # ve / veya Swift'in yaratılmasına geri dönmüş olsaydı, diller .
ve ->
jetonları C ++ kullanımına çok daha yakın bir şekilde kullanmalarıyla bu tür sorunları çevreleyen karışıklığın çoğunu geriye dönük olarak önleyebilirdi . Her iki agrega ve başvuru türleri yöntemleri kullanabilir .
üzerine hareket etmek değişken da çağrılan edildi, bunun üzerine ve ->
bir üzerine hareket etmek değeri (kompozitler için) ya da (referans tipleri için) bu şekilde tanımlanan bir şey. Ancak her iki dil de bu şekilde tasarlanmamıştır.
C # 'da, çağrıldığı değişkeni değiştirmek için bir yöntemin normal uygulaması, değişkeni ref
parametre olarak bir yönteme geçirmektir . Böylece çağıran Array.Resize(ref someArray, 23);
zaman someArray
tanımlar 20 elemanlı bir dizi neden olacaktır someArray
orijinal dizi etkilemeden, 23 elemanlarının yeni bir dizi tanımlamak için. Bunun kullanımı ref
, yöntemin çağrıldığı değişkeni değiştirmesi beklendiğini açıkça ortaya koymaktadır. Birçok durumda, statik yöntemler kullanmak zorunda kalmadan değişkenleri değiştirebilmek avantajlıdır; .
Sözdizimi kullanarak anlamına gelen Swift adresleri . Dezavantajı, değişkenlerin hangi yöntemlere ve değerlerin hangi yöntemlere etki ettiğine açıklık getirmesidir.