Προεπιλεγμένη τιμή για τα γενόσημα φάρμακα

ψήφοι
18

Πώς μπορώ να δημιουργήσω την προεπιλογή για ένα γενικό σε VB; σε C # μπορώ να καλέσετε:

T variable = default(T);
  1. Πώς μπορώ να το κάνω αυτό σε VB;
  2. Εάν αυτό επιστρέφει ακριβώς μηδενική (C #) ή τίποτα (Vb), τότε τι συμβαίνει με είδη αξίας;
  3. Είναι ένας τρόπος για να καθορίσετε ένα προσαρμοσμένο τύπο ποια είναι η προεπιλεγμένη τιμή είναι εκεί; Για παράδειγμα, τι θα γίνει αν θέλω η προεπιλεγμένη τιμή είναι το ισοδύναμο με την κλήση ενός κατασκευαστή χωρίς παραμέτρους για την τάξη μου.
Δημοσιεύθηκε 09/12/2008 στις 21:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
23

Ερώτηση 1:

Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()

Παρατηρήστε ότι το τελευταίο λειτουργεί μόνο αν έχετε ορίσει το Structureεμπόδιο για το γενικό τύπο (για τους τύπους αναφοράς, New T()σε VB κάνει κάτι άλλο από ό, τι default(T)σε C #).

Ερώτηση 2:

Για τους τύπους αξία όλων των μελών του struct είναι «nulled» έξω, είναι δηλαδή όλα τα μέλη τύπο αναφοράς που να null( Nothing) και όλα τα είδη αξίας με τη σειρά nulled έξω.

Και όχι, δεδομένου ότι stringείναι ένα είδος αναφοράς, δεν , δεν έχει ως αποτέλεσμα ""για έγχορδα όπως προτείνεται στην άλλη απάντηση.

Ερώτηση 3:

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

Απαντήθηκε 09/12/2008 στις 21:34
πηγή χρήστη

ψήφοι
5

Στην πραγματικότητα οι λαοί ο σωστός τρόπος για να γίνει αυτό είναι να ρίχνει το null( Nothing) τύπου ως γενικό τύπο ως εξής:

Dim tmpObj As T = CType(Nothing, T)

Αν θέλετε να επιστρέψετε την προεπιλεγμένη τιμή για το γενικό μπορείτε απλά να επιστρέψετε CType(Nothing, T)

Απαντήθηκε 18/12/2009 στις 17:14
πηγή χρήστη

ψήφοι
0

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

Όπως λέει ο Konrad, default(T)και Nothingείναι στην πραγματικότητα ισοδύναμα για τα δύο αξία και την αναφορά των τύπων. Η σωστή κώδικα VB θα πρέπει να είναι ως εξής σε αυτή την περίπτωση θα πάρετε την ίδια ακριβώς συμπεριφορά που παίρνετε κατά τη γνώμη μου C # κώδικα:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function DoSomething(Of T)()
    Dim x as T = Nothing;
    If x = Nothing Then
        Console.WriteLine("x is default.")
    Else
        Console.WriteLine("x has a value.")
    End If

Original (λάθος) Απάντηση

Φαίνεται σαν να μην υπάρχει VB ισοδυναμεί με default(T). Ωστόσο, σύμφωνα με τη θέση αυτή , σε αντίθεση με C #, αν Tείναι μια τιμή τύπου, σε VB μπορείτε ακόμα να χρησιμοποιήσετε Nothingτο οποίο είναι σημασιολογικά η ίδια στις περισσότερες περιπτώσεις.

Το μεγάλο μέρος όπου θα έχετε κάποιο πρόβλημα με τη χρήση Nothing, όπου θα χρησιμοποιούσατε κανονικά default(T)είναι αν θα πρέπει να δοκιμάσετε για να το εσωτερικό κωδικό σας. Ας εξετάσουμε το ακόλουθο κώδικα C #:

T ReturnSomething<T>()
{
    return default(T);
}

void DoSomething<T>()
{
    T x = default(T);
    if(x == default(T))
        Console.WriteLine("x is default.");
    else
        Console.WriteLine("x has a value.");
}

Μεταφράστηκε σε VB σαν αυτό:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function DoSomething(Of T)()
    Dim x as T = Nothing;
    If x Is Nothing Then
        Console.WriteLine("x is default.")
    Else
        Console.WriteLine("x has a value.")
    End If
End Function

Αν Tείναι ένα είδος αναφοράς, και οι δύο εκδόσεις θα λειτουργήσει ακριβώς το ίδιο και για τις δύο ReturnSomethingκαι DoSomething. Ωστόσο, αν Tείναι ένα είδος αξίας, ReturnSomethingθα λειτουργήσει ακριβώς η ίδια για κάθε γλώσσα, αλλά DoSomethingθα εκτυπώσει «x είναι η προεπιλεγμένη.» στην C # έκδοση, αλλά «χ έχει μια τιμή.» στην έκδοση VB.

Απαντήθηκε 09/12/2008 στις 22:12
πηγή χρήστη

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