C ++. Net yaygın olarak kullanılıyor mu?


25

Ben geleneğe göre bir C ++ kodlayıcısıyım. Son 12 ay boyunca çok fazla C # kodlaması yapıyorum ve C # 'nın pragmatik yaklaşımından hoş bir şekilde şaşırdım (bir zamanlar "çöp toplama ile" C ++' ymış gibi kodlamayı denedim).

Son zamanlarda bazı mezunlarımız oldu ve bunlardan birine yardım ederken C ++ 'da .Net kullandığını fark ettim. Nedenini sorduktan sonra, "menajeri tarafından C ++ kullanması" söylendiğini söyledi. Açık iletişim problemi bir yana, sanırım. Net kullandığını sanıyorum çünkü maruz kaldığı tek çerçeve bu.

Daha sonra eski bir projeye rastladım; aynı zamanda Forms ön uçlarını sürmek için C ++ kullandı. Şimdi bu, zaman içinde yazılmış olacaktı. Net ilk ortaya çıktı, bu yüzden kendi tarafında .Net ile oynamanın kendi başına bir öğrenme alıştırması olduğunu varsayıyorum. Sadece küçük bir yardımcı program uygulamasıydı.

Bu uygulamada bazı küçük değişiklikler yapmak zorunda kaldım, bana bakmak için C ++ 'ı kullanmak bana gibiydi. Net size her iki dünyanın da en kötüsünü veriyor. Çöp toplama veya hafıza güvenliği yoktur, ancak yönetilen bir çerçeveyle uğraşırken de benzer şekilde gerçek hız / optimizasyon fırsatları yoktur.

Öyleyse benim sorum, insanların tek başına herhangi bir büyük (örneğin sıhhi tesisatsız) üretim kodu için C ++ .Net kullanıp kullanmadıkları ve eğer öyleyse bunu yapmak için nedenleriniz nelerdir? Özgürce C ++ .Net uzantılarına derinlemesine dalmadığımı itiraf ediyorum, bu yüzden bir kötülük yapıyor olabilirim.

Yanıtlar:


32

C ++. NET (veya tam olarak C ++ / CLI) , .NET üzerinde çalışan her şey gibi, çöp koleksiyonuna sahiptir. Bunu C ++ ile uyumlu kalırken elde etmek için, ^sözdizimi ve gcnewçöp toplayan ('güvenli') işaretçiler için kullanır.

C ++ / CLI bir çok kötü muamele olarak kabul edilir, C # veya C ++ ile uyumlu olmaktan çok daha fazla hoş değildir ve aynı zamanda her ikisinden de daha karmaşıktır (sadece C ++ 'nın karmaşıklığını getirdiği için ve ne yapması gerektiğini ekler) .NET ile karıştırmak için). Öğrenme C # genellikle tek bir orta ölçekli proje kapsamında bile öder. Ancak, ne C # ne de doğal C ++ 'ın yapamayacağı bir şey var: mevcut C ++' ı .NET ile derleyin ve diğer .NET bileşenleriyle konuşmasını sağlayın.

Sonuç olarak, sıfırdan başlayan bir proje için C ++ / CLI'yı kullanmak pek mantıklı değil - daha güzel bir sözdizimi ve daha fazla ham maruz kalmama güvenliği ile C # 'da yapılabilir. işaretçileri varsayılan olarak En göze çarpan raison-d'etre, mevcut kod tabanlarını .NET'e taşıyor. .NET'i kullanmaya karar veren, ancak şu ana kadar ürettikleri her bir yazılımı yeniden yazmak istemeyen (veya kaynak ve zaman kısıtlamaları nedeniyle yapamayan) bir şirket, mevcut kod tabanını yalnızca minimum değişikliklerle kullanmaya devam etmek için C ++ / CLI kullanabilir. ve sonra sistemindeki bileşenleri tek tek C # ile yeniden yazarlar. En azından teori bu; Bunu kendim pratikte hiç görmedim, bu yüzden ne kadar iyi çalıştığını söyleyemem.

Ayrıca C # 'nin yerel kütüphanelerle etkileşime girebileceğini de unutmayın, bu nedenle mevcut C ++ kod tabanlarını kullanmak zorunda olsanız bile, bunları .NET ile yeniden derlemeniz gerekmez: sık sık, COM veya P / Invoke aracılığıyla onlarla etkileşim kurmak daha iyi bir çözümdür .


10
Lütfen P / Invoke ile 'yerel kütüphanelerle etkileşime girmenin' statik işlevlerle dll ile sınırlı olduğunu ve COM'un başlı başına bir güçlük olduğunu unutmayın. C ++ / CLR içindeki bir sarmalayıcı, C # kodunuzda çok az sınırlama ile tam boyutlu bir yerel arka uç / projeye temiz bir şekilde erişmenizi sağlar. Gelişim için kullanmazdım, ama tutkal olarak, P / Invoke'den çok daha temiz ve marshalling.
Maksimum

Sekonder - Ve Microsoft'un, C ++ 'ı yerel gelişimdeki haklı yerine yeniden hizaya sokma şeklini değerlendirerek tacizle anladığını düşünüyorum.
Josh Greifer,

2
Dilin gerçekte C ++ / CLI olarak adlandırıldığına dikkat edin, C ++ değil.
svick

@svick: Doğru. Düzenlenen.
tdammers

1
@Max TBH Microsoft her şeyi yerel hale getirdi. Şimdi, C ++ / CLI'ye hiç ihtiyacınız yok, bu kötü sarıcıları yerel kodla C # arabirimine yazmak zorunda değilsiniz - sadece WinRT / COM nesneleri olduklarından ve bitmiş olduklarından emin olun.
gbjbaanb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.