9
votes

Qu'est-ce que VB remplace la fonction "SET" avec?

J'ai trouvé plusieurs codes ASPX pour les formes qui incluent l'utilisation d'une fonction "SET". Lorsque je les essaie sur le serveur d'hébergement, je reçois un message d'erreur qui "définir n'est plus pris en charge". Tout le monde savait ce qui a remplacé la commande "SET"?

Plus spécifiquement, comment modifier ceci: P>

Dim mail 
Set mail = Server.CreateObject("CDONTS.NewMail") 
mail.To = EmailTo 
mail.From = EmailFrom 
mail.Subject = Subject 
mail.Body = Body 
mail.Send


0 commentaires

3 Réponses :


16
votes

Si vous voulez dire la syntaxe VB6

obj = new Object()


3 commentaires

Voici à l'origine: 'Envoyer un courrier électronique Dim Mail Set Mail = Server.CreateObject ("CDONTS.Newmail") Mail.To = Emailto Mail.from = Emailfrom Mail.subject = Soumis.Body Mail.Pody.


Donc, cela serait simplement changé en supprimant le mot "SET"?


Oui. Dans les vieux jours, vous deviez distinguer entre l'affectation d'objets et de types scalaires. Maintenant, tout est à peu près un objet afin qu'ils ont complètement vidé le mot clé défini. Je suis en fait surpris qu'ils ne l'ont pas laissé et que le compilateur l'ignore pour que l'ancien code compilait sans le changement.



6
votes

SET est un mot-clé dans VB6, avec l'intrudction de vb.net le mot clé, tel qu'utilisé dans ce contexte, a été supprimé.

Autrefois, l'ensemble a été utilisé pour indiquer qu'une référence d'objet a été attribuée (laissez-la défaut). Parce que les propriétés par défaut ne sont prises en charge que si elles acceptent les paramètres, ces instructions ont été supprimées. P>

Module Module1
    Sub Main()

    Dim person As New Person("Peter")
    Dim people As New People()

    people.Add(person)

    'Use the default property, provided we have a parameter'

    Dim p = people("Peter")

    End Sub
End Module

Public Class People
    Private _people As New Dictionary(Of String, Person)

    Public Sub Add(ByVal person As Person)
    _people.Add(person.Name, person)
    End Sub

    Default Public ReadOnly Property Person(ByVal name As String) As Person
    Get
        Return _people(name)
    End Get
    End Property
End Class

Public Class Person
    Private _name As String

    Public Sub New(ByVal name As String)
    _name = name
    End Sub

    Public ReadOnly Property Name() As String
    Get
        Return _name
    End Get
    End Property
End Class


7 commentaires

"Parce que les propriétés par défaut ne sont plus prises en charge que si elles acceptent les paramètres" ... Je ne peux pas comprendre ce que signifie cette affirmation.


Dites que vous avez eu un objet personne avec le nom de propriété par défaut. Vous pourriez alors dire hisname = mypersonObject (et VB comprendrait que vous voulez dire mypersonObject.name. Maintenant, si vous vouliez affecter MyPersonObject à HisName, vous auriez à l'utilisateur défini, c'est-à-dire définir HisName = MyPersonObject. Maintenant que les propriétés par défaut ne sont pas Soutenu, l'ensemble est devenu redondant et a été supprimé.


Non, je pense que ce que Robert Harvey ne comprend pas, c'est le "à moins qu'ils n'acceptent les paramètres". Je suis impressionné par ça aussi.


Wow, félicitations pour comprendre la langue à cette profondeur. Mais le mot-clé "Set" n'a pas été retiré de la langue; Il était nécessaire pour les compteurs des propriétés membres, ils l'ont donc coopté pour cela.


"Sauf si ils acceptent les paramètres" .. Je crois que cela parle d'indexateurs.


@ STICTY77 / @GREGORY H: Oui, le "sauf indication contraire des paramètres" est dû au fait que les propriétés par défaut n'ont pas été complètement interdites, seuls ceux qui ne nécessitent rien après leur nom. Une propriété par défaut typique est une collection de quelque chose. Par exemple, un livre peut avoir une propriété par défaut de pages, une collection d'objets de page. Vous pouvez donc écrire indexPage1 = MyBook (176) et la présence du paramètre Indexer (176) supprime toute ambiguïté.


@MJV Que se passe-t-il lorsque la propriété par défaut renvoie un autre objet avec une propriété par défaut? Une simple affectation ne renvoie-t-elle que la profondeur de la première propriété par défaut? Ou recueille-t-il jusqu'à la propriété la plus interne par défaut?



4
votes

Certaines choses à retenir pour .NET:

  • N'utilisez jamais Server.CreateObject () dans le code .NET. Jamais. Li>
  • Ne sortez jamais une variable sans lui donner un type explicite. Sauf pour le nouveau Inférer d'option Code> Linq Types Li>
  • n'utilisez jamais le mot-clé défini. Sauf lors de la définition d'une propriété. Li> ul>

    En fait, vous pouvez vous débarrasser probablement de la dépendance des CDONTS entièrement, car .NET dispose d'un support de courrier intégré: P>

    Dim smtp As New System.Net.SmtpClient()
    Dim message As New System.Net.MailMessage(EmailFrom, EmailTo, Subject, Body)
    smtp.Send(message)
    


0 commentaires