Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Limits von C# / CSharp
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

Limits von C# / CSharp

beantworten | zitieren | melden

Wo sind die Limits von C#?

Bsp.:

z.B. ist es nicht ohne weiteres möglich DLL-Funktionen von CSharp für mit VS 6.0 C++ erstellte Programme zu exportieren. (Stichwort vtable entry manuell ergänzen in IL-Code)

Es ist nicht ohne weiteres möglich bei (generischen) Listen für Add und Remove Events auszulösen.

Es ist nicht möglich Attribute ohne Reflection zur Ausführung zu bringen, in dem Sinne, wie es z.B. PostSharp ermöglicht.

Es kann kein Code zur Laufzeit/Compilezeit verändert werden und damit die Assembly zur Laufzeit verändert werden.

Keine Mehrfachvererbung im Sinne von C++

Nachgeladene Assemblies können nicht entladen werden (mal abgesehen über den Ausweg von AppDomain)

Welche Features fehlen euch?

Egal ob diese in Richtung der genannten Beispiele gehen oder nicht.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Powerslave
myCSharp.de - Member



Dabei seit:
Beiträge: 554

beantworten | zitieren | melden

Zitat
Es kann kein Code zur Laufzeit/Compilezeit verändert werden.

Was meinst du damit? Klaro kannst du während des Debuggens Code ändern und danach weiterlaufen lassen.
Achtung! - Hinter dir ist ein dreiköpfiger Affe!
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Ich meine so etwas in der Art:


LoadAssembly (...);
myClass = Type.GetType (...)
foreach (Method m in myClass) {
   InsertStatement (...) //new Code goes here
}
SaveAssembly (...);

Assemblies zur Laufzeit verändern.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Assemblies zur Laufzeit erzeugen

beantworten | zitieren | melden

Du kannst aber Assemblies zur Laufzeit erzeugen. Also komplett im Hauptspeicher aufbauen, dort übersetzen und direkt laufen lassen.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@Rainbird:

das hatte ich auch ja selbst schon in

Objekte an Laufzeit kompilierten Code übergeben oder auslesen (allgemeine Kommunikation)

beschrieben,

es ist aber nicht möglich, im Enhancer-Sinne (s. dazu [gelöst] Event auf Methoden-Aufruf über Attribute)
Code zur Laufzeit/Compilezeit mit Boardmitteln von C# zu verändern,
auch bezogen auf die eigene Assembly in der man sich gerade befindet.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.976

beantworten | zitieren | melden

Wenn man sich von vornherein auf eine Lösung versteift, wird man nie eine
anderen Lösungsweg akzeptieren.

Hast Du dir schon mal DynamicMethod angeschaut?
Damit kannst Du relativ einfach ILCode zur Laufzeit erzeugen.

Wenn Du da genauso viel energie hineinsetzt wie in deinen Enhancer hast Du
eine vergleichbare lösung.

Du kannst auch mit Linq code generieren und compilieren, und......


Wie heist es immer so schön, viele Wege führen nach Rom ( aber wer will da schon hin ;-)
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Die meisten deiner genannten Merkmale sind aber nicht C# spezifisch sondern gründen in .Net.

Zum Beispiel das Entladen der Assemblies, die nichtvorhandene Mehrfachvererbung, die Änderung vorhandenen Codes zur Laufzeit usw.

Das wird nicht durch C# sondern durch die CLI und das CTS vorgeschrieben.

Genauso das Auslösen der Events bei den Collections, das liegt wiederum in der BCL und nicht in C#

Es ist wirklich schwer reine Merkmale von C# aufzulisten, aber es gab mal nen Thread hier dazu wo es vor allem um die fehlende Transparenz bei den Typen ging(bei Verwendung von Variablen nicht erkennbar ob es Werte oder Referenztypen sind, bei C++ z.b. leicht erkennbar anhand ob nun nen *, & bzw. . oder -> benutzt wird), und auch Properties die nicht als solche erkannt werden und Fehler provozieren können.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Ok, noch mal zur Klarstellung:

Ich wollte gar keine Gegenbeispiele zu meinen Beispielen, ich wollte wissen wo liegen für EUCH die Limits in C-Sharp?

Was habt ihr euch schon oft gewünscht, was mit C-Sharp nicht möglich ist oder was ihr nicht hinbekommt?

Vielleicht hätte ich die Formulierung auch einfach so machen sollen:

Was wünscht ihr euch für die C# Spezifikation 4.0?
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Praktisch alle Features von CΩ :) Okay, der Datenzugriff wurde in Form von Linq schon eingebaut, aber die asynchronen Methoden und Streams sind auch klasse.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.976

beantworten | zitieren | melden

Wenn Du dir die möglichkeiten von der 3.5 anschaust, und speziell etwas wie
Jasper siehst, dann wünsche ich mir das schon lange in VB.NET und IronPython
mögliche LateBinding.

Wenns geht mit einem Schlüsselwort, und ständigem nicht abschaltbaren
gemecker vom Compiler, damit es nicht zur gewohnheit wird ;-)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo dr4g0n76,

von dem, was du gesagt hast, stören mich eigentlich nur diese beiden Punkte:
Zitat
Es ist nicht ohne weiteres möglich bei (generischen) Listen für Add und Remove Events auszulösen.

Es ist nicht möglich Attribute ohne Reflection zur Ausführung zu bringen, in dem Sinne, wie es z.B. PostSharp ermöglicht.
Wobei mich eigentlich nicht stört, dass man Reflection benutzen muss. Mich stört eher, dass man in einer Methode/Propertie nicht einfach sagen kann: Gib mir alle "meine" Attribute.

Und der Punkt mit Add/Remove ist eher eine Folge einer allgemeineren Schwäche von C#:

- Methoden sind nicht per default virtual.

Ich weiß zwar auch, warum das so ist, aber ich denke, die Vorteile würden überwiegen, wenn alle Methoden virtual wären.

Dann gibt es noch eine Kleinigkeit, die mich aber nicht wirklich stört. Eher einer kleine Unebenheit der Sprache:

- Properties können nicht bei out oder ref verwendet werden.

Dich könnte auch noch Schwächen der C#-Sprache interessieren.

herbivore
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat
Original von dr4g0n76
Was habt ihr euch schon oft gewünscht, was mit C-Sharp nicht möglich ist oder was ihr nicht hinbekommt?

Na ja, die Überladung einer Methode nur durch ihren Rückgabewert wäre manchmal sehr praktisch.

Das also so etwas realisierbar wäre:


decimal Multiplizieren(decimal d1, decimal d2)
{
   return d1 * d2;
}

double Multiplizieren(decimal d1, decimal d2)
{
   return Convert.ToDouble(d1 * d2);
}
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

Hallo winSharp93,

Dass das nicht geht kann ich gut nachvollziehen! Es würde viel zu viele Probleme mit sich bringen, weil es gibt endlose Situationen, in denen nicht klar entschieden werden kann, welche "Überladung" genommen werden soll. Ein simples Beispiel:

decimal Multiplizieren(decimal d1, decimal d2)
{
   return d1 * d2;
}

double Multiplizieren(decimal d1, decimal d2)
{
   return Convert.ToDouble(d1 * d2);
}
Aufruf:

object myVar = Multiplizieren(dec1, dec2);
Ich hoffe du kannst nachvollziehen, warum es dieses "Feature" nicht gibt.

Gruß,
Thomas
A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo progger,

naja, ich finde eher das Argument, dass man den Rückgabewert gar nicht übernehmen muss, bzw. dass durch das Überladen von Rückgabewerten das Übernehmen des Rückgabewerts erzwungen werden würde.

Denn das nicht Eindeutigkeitsproblem hat man ja auch beim Überladen von Parametern (ohne dass deshalb das Überladen von Parametern verboten wäre):

decimal Multiplizieren(decimal d1, decimal d2) ...
double Multiplizieren(double d1, double d2) ...
Multiplizieren (1, 1);
Zitat
error CS0121: Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften: Bsp.Multiplizieren(decimal, decimal) und Bsp.Multiplizieren(double, double).
herbivore
private Nachricht | Beiträge des Benutzers
cdr
myCSharp.de - Member



Dabei seit:
Beiträge: 980
Herkunft: Zürich

beantworten | zitieren | melden

Ich hätte mir schon mal etwas ähnliches gewünscht: Das Überschreiben (nicht überladen) mit einem Rückgabe-Typ der vom vorherigen Rückgabe-Typ ableitet:


class A {}
class B : A {}

class X
{
    public virtual A Foo()
    { ... }
}

class Y : X
{
    public override B Foo()
    { ... }
}

Wobei B zwingend von A erben muss. Afaik gibt es OO Sprachen die das unterstützen.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Das mit dem Überladen von Funktionen find ich nicht ganz so tragisch. Man muss sich nur ein paar "neue" Namen einfallen lassen.



public double ToDouble(...)

public int ToDouble(...)


Reizen würde mich eher, das die Mehrfachvererbung ähnlich C++
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

Was mir bei C# fehlt sind statische lokale Variablen wie z.B. in C und C++.


int GetNextNumber() {
    static int val = 0;
    
    if (val > 1024)
        val = 0;

    return val++;
}
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo marsgk,

bis auf die größere Sichtbarkeit entsprechen Klassenvariablen dem, was du willst.

herbivore
private Nachricht | Beiträge des Benutzers
onlinegurke
myCSharp.de - Member



Dabei seit:
Beiträge: 779
Herkunft: Dresdner in Karlsruhe

beantworten | zitieren | melden

Naja, ich will ja nix sagen, aber auch statische lokale Variablen gibts bei VB.NET, die sind im IL-Code auch als Klassenvariablen implementiert. Wenn ich eine statische Integer-Variable mit dem Namen i in einer Methode Test anlege, dann erzeugt VB automatisch die Klassenvariable $STATIC$2001$Test$i, die im IL-Code mit dem Modifikator specialname ausgestattet ist.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo onlinegurke,

da der Thread aber "Limits von C# / CSharp" und nicht "Features von VB / VisualBasic" heißt, ändert es nichts an dem Limit von C#, wenn es das Feature in VB gibt. :-)

herbivore
private Nachricht | Beiträge des Benutzers
onlinegurke
myCSharp.de - Member



Dabei seit:
Beiträge: 779
Herkunft: Dresdner in Karlsruhe

beantworten | zitieren | melden

Die Aussage sollte sein, dass das vermeintliche Feature von anderen Sprachen, statische lokale Variablen anlegen zu können (z.B. eben VB.NET), nur eine reine Compilezeitgeschichte ist, und damit in meinen Augen nicht wirklich ein Limit...
private Nachricht | Beiträge des Benutzers
onlinegurke
myCSharp.de - Member



Dabei seit:
Beiträge: 779
Herkunft: Dresdner in Karlsruhe

beantworten | zitieren | melden

Was mich an C# stört ist aber die Uneindeutigkeit von { und }, weil das das Parsen von Quelltext sehr erschwert...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo onlinegurke,

ja, aber VB sorgt dann dafür, dass obwohl es intern eine Klassenvariable benutzt, auf diese nur aus der jeweiligen Methode zugegriffen werden kann. Wenn man in C# "von Hand" eine Klassenvariable benutzt, muss man darauf selber aufpassen. Insofern ist es schon ein kleines Limit (im Sinne von Schwäche) von C#, wenn der Compiler keine lokalen statischen Variablen unterstützt.

Was meinst du mit Uneindeutigkeit?

herbivore
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Ich persönlich finde die Generics nicht ganz überzeugend. Diese komische Zwitterverhalten (Compile- vs. Laufzeit) ist manchmal sehr lästig - auch wenn mir klar ist, dass es da nix zu verbessern gibt, ohne .NET komplett umzukrempeln.
private Nachricht | Beiträge des Benutzers
onlinegurke
myCSharp.de - Member



Dabei seit:
Beiträge: 779
Herkunft: Dresdner in Karlsruhe

beantworten | zitieren | melden

@herbivore

{ und } können das Ende eines beliebigen Codeabschnitts sein, also von
- einer Klassendefinition
- einer Methodendeklaration
- einer Struktur
- einer Enumeration
- einer Eigenschaft
- einer Get-Deklaration
- einer Set-Deklaration
...
u.v.m.

Ich hab vor einiger Zeit ja mal ein Progrämmchen programmiert um bestehenden Quellcode zu sortieren, da ging's dann im Parser drum zu erkennen, was der gerade eingelesene Code nun darstellt, um z.B. die Eigenschaften zu sortieren und auszulagern. Eine nicht funktionierende Vorversion davon für VB.NET (das sagt einem ja, welcher Codeabschnitt gerade beendet wird) steht auch irgendwo unter Projekte. Bei C# ist sowas aber viel aufwändiger, weil man die ganze Zeit die { und } mitzählen muss (außerdem ist eine Felddefinition nicht wirklich erkennbar)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von onlinegurke am .
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

Zitat
Original von herbivore
Hallo marsgk,

bis auf die größere Sichtbarkeit entsprechen Klassenvariablen dem, was du willst.

herbivore

Und genau auf die Sichtbarkeitsunterschiede kommt es mir auch an :D. Ich dachte mit meinem Beispiel kann ich das etwas verdeutlichen. Öfters brauche ich eine Variable nur in einer Funktion, dafür aber "statisch". Diese Variable als Membervariable zu deklarieren ist unübersichtlicher.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Zitat
Original von onlinegurke
@herbivore

{ und } können das Ende eines beliebigen Codeabschnitts sein, also von
- einer Klassendefinition
- einer Methodendeklaration
- einer Struktur
- einer Enumeration
- einer Eigenschaft
- einer Get-Deklaration
- einer Set-Deklaration
...
u.v.m.

Ich hab vor einiger Zeit ja mal ein Progrämmchen programmiert um bestehenden Quellcode zu sortieren, da ging's dann im Parser drum zu erkennen, was der gerade eingelesene Code nun darstellt, um z.B. die Eigenschaften zu sortieren und auszulagern. Eine nicht funktionierende Vorversion davon für VB.NET (das sagt einem ja, welcher Codeabschnitt gerade beendet wird) steht auch irgendwo unter Projekte. Bei C# ist sowas aber viel aufwändiger, weil man die ganze Zeit die { und } mitzählen muss (außerdem ist eine Felddefinition nicht wirklich erkennbar)

Mit Xml kannst du auch viele geschachtelte Sachen auslesen. Ich finde das ist nicht so das große Problem.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

die schlimmste sünde in c# ist die unmäßige verwendung des sealed keywords...

meinetwegen kann man das keyword ganz streichen...

ausserdem schließ ich mich herbivore an mit:
- Methoden sind nicht per default virtual.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von 0815Coder am .
loop:
btst #6,$bfe001
bne.s loop
rts
private Nachricht | Beiträge des Benutzers
VizOne
myCSharp.de - Member

Avatar #avatar-1563.gif


Dabei seit:
Beiträge: 1.373

beantworten | zitieren | melden

Generics haben tatsächlich noch einige Schwächen, vor allem in den Constraints. Was zum Beispiel fehlt:
- Parameter für den Konstruktor (z.B. where Foo : new(int, double))
- Operatoren (z.B. where Foo : operator+(Foo, Foo)), das würde endlich generische mathematische Algorithmen ermöglichen

Was mir sonst noch einfällt:

Indizierte Properties (außer this), VB und C++/CLI können es nämlich:

Also etwa:


public class Foo {

  List<string> wörter;
  List<int> zahlen;

  public string Wörter[int index] {
    get { return wörter[index];  }
  }

  public int Zahlen[int index] {
    get { return zahlen[index];  }
  }
}

Eine der größten Schwächen in der BCL ist meiner Meinung nach die sehr schwache Collections-Bibliothek. Zum einen unvollständig, zum anderen würde ich mir eine stärkere Aufspaltung zwischen lesenden und schreiben Funktionen wünschen. ICollection hat z.B. immer eine Add/Remove/Clear-Methode, auch wenn die Collection Schreibgeschützt ist. Ich fände es besser, wenn alle lesenden Eigenschaften und Methoden in ein eigenes Interface ICollectionView oder so fließen würden und ICollection dann von ICollectionView erbt und Add/Remove/Clear zufügt. Dadurch könnte man schon zur Compilezeit die Nur-Lesbarkeit einer Collection ausdrücken, indem man dem client nur ein ICollectionView-Objekt zur Verfügung stellt. Entsprechendes müsste dann auch mit IList und IDictionary gemacht werden. Ich sehe allerdings ein, dass das die Anzahl der Interfaces und Klassen drastisch erhöhen würde. Ist halt ein Trade-Off zwischen Funktionalität und Übersicht.

Grüße,
Andre
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von VizOne
Indizierte Properties (außer this), VB und C++/CLI können es nämlich:

Full ack. Statt der blöden Indexer wären mir parametrisierbare Properties auch viel lieber gewesen.
private Nachricht | Beiträge des Benutzers