Δημόσια και Εσωτερικών μελών σε μια εσωτερική τάξη;

ψήφοι
51

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

Υπάρχει κάποια διαφορά όσον αφορά την προβολή υπάρχει / χρηστικότητας μεταξύ ενός publicμέλους δηλωθεί σε μια internalτάξη και ένα internalμέλος έχει δηλωθεί σε μια internalτάξη;

δηλαδή μεταξύ

internal class Foo
{
    public void Bar()
    {
    }
}

και

internal class Foo
{
    internal void Bar()
    {
    }
}

Αν κήρυξε την μέθοδο όπως publicκαι επίσης virtual, και στη συνέχεια αγνόησε το σε ένα προέρχεται τάξη που είναι public, ο λόγος για τη χρήση αυτής της τροποποίησης είναι σαφής. Ωστόσο, είναι αυτή η μόνη κατάσταση ... είμαι λείπει κάτι άλλο;

Δημοσιεύθηκε 01/04/2010 στις 22:14
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
0

publicμέλη μιας internalκατηγορίας μπορούν να παρακάμψουν publicτα μέλη των publicκατηγοριών βάσης και, ως εκ τούτου, να είναι λίγο πιο εκτεθειμένες ... αν έμμεσα.

Απαντήθηκε 01/04/2010 στις 22:16
πηγή χρήστη

ψήφοι
29

Ένα publicμέλος εξακολουθεί να είναι απλά internal, όταν σε μια internalτάξη.

Από MSDN :

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

Σκεφτείτε το αυτό τον τρόπο, θα αποκτήσετε πρόσβαση σε ένα publicακίνητο για ....; Μια τάξη δεν μπορώ να δω; :)

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

Απαντήθηκε 01/04/2010 στις 22:18
πηγή χρήστη

ψήφοι
47

Σκεφτείτε την περίπτωση αυτή:

public interface IBar { void Bar(); }
internal class C : IBar
{
    public void Bar() { }
}

Εδώ C.Bar δεν μπορούν να χαρακτηρίζονται ως εσωτερικά? αυτόν τον τρόπο είναι ένα λάθος, διότι C.Bar μπορεί να προσεγγιστεί από έναν επισκέπτη του D.GetBar ():

public class D
{
    public static IBar GetBar() { return new C(); } 
}
Απαντήθηκε 01/04/2010 στις 22:23
πηγή χρήστη

ψήφοι
1

Αν πρόκειται για αντανάκλαση έχει σημασία αν το μέλος είναι δημόσιες ή όχι:

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

Απαντήθηκε 26/06/2012 στις 14:57
πηγή χρήστη

ψήφοι
1

Απλά αντιμέτωποι με ένα άλλο παράδειγμα, όπου εκεί είναι η διαφορά μεταξύ αυτών των δύο, όταν χρησιμοποιούνται από XAML σε WPF.

XAML:

<Button Tag="{x:Static vm:Foo+Bar.e1}" />

Κώδικας με internalenum συγκεντρώνει με επιτυχία:

internal class Foo
{
    internal enum Bar
    {
        e1,
        e2,
    }
}

Αλλά έκπληξη το γεγονός ότι η αλλαγή να publicέχει ως αποτέλεσμα λάθους:

internal class Foo
{
    public enum Bar
    {
        e1,
        e2,
    }
}

Το τελευταίο παράδειγμα παράγει σφάλμα μεταγλώττισης:

MC3064 σφάλμα: Μόνο δημόσια ή εσωτερικές κλάσεις μπορεί να χρησιμοποιηθεί μέσα σήμανσης. τύπου «Bar» δεν είναι δημόσια ή εσωτερική.

Δυστυχώς, δεν μπορώ να εξηγήσω τι είναι λάθος με publicσε αυτή την περίπτωση. Η εικασία μου είναι «μόνο και μόνο επειδή WPF λειτουργεί με αυτόν τον τρόπο». Απλά αλλάζουν τροποποίησης του ένθετων τάξη για internalνα απαλλαγούμε από το σφάλμα.

Απαντήθηκε 08/10/2015 στις 13:59
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more