Προς το περιεχόμενο

Γενικό thread αποριών για τη C#.


Alithinos

Προτεινόμενες αναρτήσεις

Γιατί όταν λες "Μια λίστα δέχεται μεθόδους" ο άλλος καταλαβαίνει ότι εννοείς αυτό:

List<method> list1 = new List<method>() { EmptyMethod1(), EmptyMethod2()};

Το οποίο δεν γίνεται!

 

 

Sorry για το off topic :)

var list = new List<Action>() {
    () => Console.WriteLine("a"),
    () => Console.WriteLine("b")
};

list.ForEach(x => x());
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 505
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

 

Sorry για το off topic :)

var list = new List<Action>() {
    () => Console.WriteLine("a"),
    () => Console.WriteLine("b")
};

list.ForEach(x => x());

:o

Άρα ο Μ2000 είχε δίκιο σε αυτό ε ?

 

Ντάξει... όπως είπα σε προηγούμενο μήνυμα δεν έχω καλύψει τις δομές δεδομένων ακόμα, είναι το επόμενο κεφάλαιο του βιβλίου απ' όπου μαθαίνω, από κει που είμαι τώρα.

 

Και θυμάμαι να έχω διαβάσει κάπου πως ξεκαθάριζαν ρητά ότι άλλο πράγμα τα δεδομένα (τα οποία απλά υπάρχουν παθητικά, χωρίς λειτουργικότητα, και δεν κάνουν κάτι ενεργητικά τα ίδια), και άλλο οι εκφράσεις / συναρτήσεις που δρουν ενεργητικά στα δεδομένα και έχουν λειτουργικότητα.

 

Έτσι λοιπόν αφού μιλάμε για "δομή δεδομένων" θεώρησα πως μια δομή δεδομένων θα μπορεί να λάβει  μόνο δεδομένα, δηλαδή μόνο παθητικές πληροφορίες, και όχι πχ συναρτήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Offtopic συνέχεια...

 

Και το τελείως empty επίσης γίνεται:

var list = new List<Action>() { () => {}, () => {}, () => {}, };

αν και βέβαια δε μπορείς να κάνεις τίποτα ενδιαφέρον έτσι.

 

Το ίδιο σε C++

vector<function<void(void)>> list { [](){}, [](){} };

αν και εδώ πλέον φτάνει να μοιάζει με trolling.  :-D

 

That said, σε καμία από τις δύο γλώσσες δεν είναι "μέθοδοι" αυτό που βάζεις μέσα επειδή καμία από τις δύο δεν έχει first class functions. Αλλά υπάρχουν γλώσσες που έχουν (πχ JavaScript).

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μια λάμβδα έκφραση δεν έχει τύπο, συνεπώς δεν μπορει να χρησιμοποιηθεί για να εξαχθεί ο τύπος μιας

τοπικής μεταβλητής. Ως εκ τούτου, π.χ. το

 var v = x => x;

θα δώσει σφάλμα. Ομοίως είναι λανθασμένο το

var list = new List<Action>()  ....κλπ

που αναφέρθηκε παραπάνω.

 

 

Τέλος, μπορεί να γραφεί χωρίς πρόβλημα κάτι σαν το ακόλουθο

public static bool GreaterThan(int first,int second)
{ return first>second; } 

public static bool AlphabeticalGreaterThan(int first,int second)
{  return (first.ToString().CompareTo(second.ToString()))> ? 1 : 0; }

List<Func<int,int,bool>> list = new List<Func<int,int,bool>> {GreaterThan, AlphabeticalGreaterThan };
...
bool q = list[0](5,3);





-

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

No, please. Όσοι γράφουν τέτοια πράγματα πρέπει να τους ρίχνουν στην φωτιά (Γενικά μιλάω, όχι για σένα προσωπικά DDevil, καταλαβαίνω πως είναι παράδειγμα).

 

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μια λάμβδα έκφραση δεν έχει τύπο, συνεπώς δεν μπορει να χρησιμοποιηθεί για να εξαχθεί ο τύπος μιας τοπικής μεταβλητής. Ως εκ τούτου, το

 

 var v = x => x;

θα δώσει σφάλμα.

Ομοίως είναι λανθασμένο το

var list = new List<Action>()  ....κλπ

που αναφέρθηκε παραπάνω.

 

Τέλος, μπορεί να γραφεί κάτι σαν το παρακάτω

public static bool GreaterThan(int first,int second)
{ return first>second; } 

public static bool AlphabeticalGreaterThan(int first,int second)
{  return (first.ToString().CompareTo(second.ToString()))> ? 1 : 0; }

List<Func<int,int,bool>> list = new List<Func<int,int,bool>> {GreaterThan, AlphabeticalGreaterThan };
...
bool q = list[0](5,3);







-

 

Λανθασμένο για ποιο λόγο; Περνάει κανονικά compile και το αποτέλεσμα είναι το expected.

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

 

Καλό είναι να αποφεύγονται τέτοιες πρακτικές αν πρόκειται κάποιος να δουλέψει σε ένα σοβαρό project (maintainability, κλπ.). Για την πάρτη μας everything goes, αλλά αν πρόκειται να μπλέξει και άλλος κόσμος -> KISS.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, έχεις δίκιο, έγραψα απρόσεκτα. Το

 

var list = new List<Action>()..

 

κάνει compile διότι ο τύπος εξάγεται. Ωστόσο, το

var v = x => x;

 

θα "χτυπήσει" οπωσδήποτε.

 

-

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και η Μ2000 έχει first class functions...

 

image.png?w=400&c=1

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

 

Hold your horses cowboy, τέτοια ασχολίαστα for μπορείς να γράψεις σε οποιαδήποτε γλώσσα.

 

Και στη M2000 μπορείς, γιατί εκεί τα for υλοποιούνται με συνάρτηση τραμπολίνο που μπορεί να επιστρέψει την εκτέλεση στο προηγούμενο σημείο του αντικειμένου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
List<method> list1 = new List<method>() { EmptyMethod1(), EmptyMethod2()};

Το οποίο δεν γίνεται!

Για αυτό και σου κάνουν παρατηρήσεις και σε κράζουν.

 

Γίνεται, αλλά με Reflection. Παράδειγμα:

class Program {
        public Program() {
        }

        static void Main(string[] args) {
            List<string> methods = new List<string>() { "Method1", "Method2" };
            foreach (string methodName in methods) {
                object tmpObj = new Program();
                MethodInfo mi = tmpObj.GetType().GetMethod(methodName);
                object[] paramsArray = new object[] { };
                mi.Invoke(tmpObj, paramsArray);
            }
        }

        public static void Method1() {
            Console.WriteLine("Executing method 1");
        }

        public static void Method2() {
            Console.WriteLine("Executing method 2");
        }
    }
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τώρα κάνουμε αστεία με τη Μ2000;

Λοιπόν στη Μ2000,η For γίνεται τουλάχιστον μια φορά, γιατί ο έλεγχος γίνεται μετά την εκτέλεση του μπλοκ. Μπορεί μια Προς (Goto) όμως να βγάλει τη ροή από το μπλοκ σαν να μην υπήρχε For.

Η Μ2000 έχει ανώνυμες συναρτήσεις. Και άλλα πολλά.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τώρα κάνουμε αστεία με τη Μ2000;

Λοιπόν στη Μ2000,η For γίνεται τουλάχιστον μια φορά, γιατί ο έλεγχος γίνεται μετά την εκτέλεση του μπλοκ. Μπορεί μια Προς (Goto) όμως να βγάλει τη ροή από το μπλοκ σαν να μην υπήρχε For.

Η Μ2000 έχει ανώνυμες συναρτήσεις. Και άλλα πολλά.

 

Ρε άστους να λένε τα δικά τους. Θα εξαπλωθεί η Μ2000 και θα την βλέπουνε παντού κα θα λυσάνε. :cry:

 

Τι θα σου κάνουν??? θα σου κοψουν το μισθο? χαχαχα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Όταν ξεκίνησα τη γλώσσα δεν είχα φανταστεί που θα έφτανε, σε ολοκλήρωση.

Περίμενα να βρω άτομα που θα βοηθούσαν,θα εμπλούτιζαν, αλλά μάλλον ζητάω πολλά. Είναι βαρύ το θέμα.

Παράδειγμα συναρτησιακού προγραμματισμού σε Μ2000.

http://georgekarras.blogspot.gr/2015/09/2000_70.html

Χρησιμοποιεί τις ανώνυμες συναρτήσεις.

Επεξ/σία από M2000
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...