Re: Shared functions vs Non-Shared Functions
- From: "tshad" <tscheiderich@xxxxxxxxxxxxxxx>
- Date: Thu, 26 May 2005 15:17:52 -0700
"tshad" <tscheiderich@xxxxxxxxxxxxxxx> wrote in message
news:u0t5V%23iYFHA.3184@xxxxxxxxxxxxxxxxxxxxxxx
> "Karl Seguin" <karl REMOVE @ REMOVE openmymind REMOVEMETOO . ANDME net>
> wrote in message news:O%238$KwiYFHA.4032@xxxxxxxxxxxxxxxxxxxxxxx
>> You would create an instance class with instance members if you wanted to
>> create an Email object, set it's properties and have a Send() method,
>> ala:
>>
>> dim email as new Email("some subject")
>> email.Body = "xxx"
>> email.Send()
>>
>>
>> you would use a shared member if you wanted to pass everything in as
>> parameters
>>
>> EmailHelp.Send("some subject", "xxx")
>>
>> I personally prefer the syntax of the 2nd example...but if you wanted to
>> keep a bunch of different emails, say you wanted to cache them or move
>> them around between your layers, it'd be necessary to have distinct
>> instances.
>
> I prefer the 2nd example also.
>
> But when you talk about caching or moving them, are you saying that you
> want an instance so you could do something like:
>
> sub somefunction (myEmail as Email)
> ...
> myEmail.somemethod()
>
> end sub
>
> Then using your 1st example:
>
> dim email as new Email("some subject")
> email.Body = "xxx"
> email.Send()
> ...
> somefunction(email) ' calling the above function
>
>
> BTW, I took my email function and tried to compile it using:
>
> C:\Inetpub\wwwroot\staffingworkshop>vbc /t:library email.vb
> /r:system.web.dll /r:system.data.dll /r:system.dll
> /r:Microsoft.VisualBasic.dll
>
> and I get the following errors:
>
> C:\Inetpub\wwwroot\staffingworkshop\email.vb(49) : error BC30469:
> Reference to a non-shared member requires an object reference.
>
> I am getting this for request.path and for MapPath.
>
> My file looks like:
> **********************************************************************************
> Imports System
> Imports System.Web
> Imports System.IO
> Imports System.Web.UI
> Imports System.Web.SessionState
> Imports System.Web.Mail
> Imports System.Data
> Imports System.Data.SqlClient
> Imports System.Web.HttpCookie
> Imports System.Web.HttpCookieCollection
> Imports System.Web.HttpResponse
> Imports System.Web.HttpRequest
> Imports System.Web.HttpApplication
> Imports System.Web.HttpApplicationState
> Imports Microsoft.VisualBasic
>
> NameSpace MyFunctions
>
> Public Class Email
>
> Public Shared sub sendEmail ( )
> dim webMasterEmail As String
> dim emailSubject As String
> Dim mailServer As String
> Dim contactEmail As String
> Dim screenTestSubject As String
>
> Dim emailReader As SqlDataReader
>
> Dim ConnectionString as String
> =System.Configuration.ConfigurationSettings.AppSettings("MM_CONNECTION_STRING_ftsolutions")
> Dim objConn as New SqlConnection (ConnectionString)
> Dim CommandText as String = "Select
> MailServer,WebMasterEmail,ContactEmail,ScreenTestSubject from
> emailResponse where ClientID = '1234'"
> Dim objCmd as New SqlCommand(CommandText,objConn)
>
> objConn.Open()
>
> emailReader = objCmd.ExecuteReader
>
> if emailReader.Read then
> mailServer = emailReader("MailServer")
> webMasterEmail = emailReader("WebMasterEmail")
> contactEmail = emailReader("ContactEmail")
> screenTestSubject = emailReader("ScreenTestSubject")
> end If
>
> objConn.close()
>
> dim URLPath As String = _
> Left(request.path, InStrRev(request.path, "/") - 1)
>
> Dim objStreamReader as StreamReader
> Dim strInput As String
> Dim strBuffer As String
>
> If File.exists(MapPath("..\..\automail\new_account_automail.htm")) then
> objStreamReader =
> File.OpenText(MapPath("..\..\automail\new_account_automail.htm"))
> strInput = objStreamReader.ReadLine()
> while strInput <> nothing
> strBuffer = strBuffer & strInput
> strInput = objStreamReader.ReadLine()
> end while
> objStreamReader.Close
> end if
>
> Dim Message As New MailMessage()
> message.To = contactEmail
> message.From = webMasterEmail
> message.Subject = screenTestSubject
> message.Body = "This is line 1<br><br>"
> message.Body = message.Body & "This is line 2<br><br>"
> strInput = strBuffer.replace("#MESSAGE#",message.Body)
> strInput = strInput.replace("#MAILTITLE#","Screen Test Confirmation")
> message.Body = strInput
> message.BodyFormat = MailFormat.Html
> SmtpMail.SmtpServer = mailServer
> smtpMail.Send(message)
> end sub
>
> End Class
>
> End Namespace
> ************************************************************************************
>
> This happens whether emailSend is Shared or not.
I finally got it to work, but not as it should.
To get the MapPath to work I stripped out all but the essential code to
figure it out and plus something I saw on one of the newsgroups.
****************************************************************************************
imports System
imports System.IO
imports System.Web.HttpContext
NameSpace MyFunctions
Public Class Email
Public Shared sub sendEmail ( )
If
File.exists(Current.Server.MapPath("..\..\automail\new_account_automail.htm"))
then
end if
end sub
End Class
End Namespace
********************************************************************
I needed the following:
imports System.Web.HttpContext
And the MapPath changed to:
If
File.exists(Current.Server.MapPath("..\..\automail\new_account_automail.htm"))
then
Not sure how to get rid of Current and Server (I don't need this in my
normal aspx page).
I still haven't figured out the "request" error yet. But this is all hit or
miss.
The MSDN is no help at all. I found this by accident. Isn't there a place
to find this? I should have to play games to get this to work.
MSDN says MapPath is part of the Server object, but nowhere (that I can
find) does it show how to define it in your code.
Tom
>
> Thanks,
>
> Tom
>
>>
>> Trust your gut feeling.
>>
>> Karl
>>
>> --
>> MY ASP.Net tutorials
>> http://www.openmymind.net/ - New and Improved (yes, the popup is
>> annoying)
>> http://www.openmymind.net/faq.aspx - unofficial newsgroup FAQ (more to
>> come!)
>> "tshad" <tscheiderich@xxxxxxxxxxxxxxx> wrote in message
>> news:%23EYViOiYFHA.1404@xxxxxxxxxxxxxxxxxxxxxxx
>>> "Karl Seguin" <karl REMOVE @ REMOVE openmymind REMOVEMETOO . ANDME net>
>>> wrote in message news:e5dfeFiYFHA.3364@xxxxxxxxxxxxxxxxxxxxxxx
>>>> Tom:
>>>> Is the function manipulating instance data? Looking at your functions,
>>>> they look like they need to be shared.
>>>>
>>>> Think of it this way.
>>>>
>>>> You have a class called Car, which has a property named AirbagDeployed
>>>> as boolean
>>>>
>>>> if you have a function named DeployAirbag() it would need to be an
>>>> instance (non-shared) method. Why? Because you would have create a
>>>> new car instance and would want to deploy that particular car's airbag.
>>>> in other words, instnace methods behave against a particular instance.
>>>> Your BitHandling class looks like a helper function for dealing with
>>>> bit information. You wouldn't create separate instance of them as you
>>>> don't need to represent different bithandling (as you would differnent
>>>> cars)...ergo your function don't behave against instances.
>>>>
>>>> A case where you might have instances is if your BitHandling was
>>>> culture-specific. In which case you might have different bithandling
>>>> instances per culture. In this case you'd need to create a new
>>>> BitHandling class (specifying the culture) and then your functions
>>>> would behave against that particular instance. (As an aside, an
>>>> alternative would be to pass the culture information to each shared
>>>> function so you wouldn't need to create culture-specific instances
>>>> which works fine for a single parameter, but becomes messy when you're
>>>> talking about more..)
>>>
>>> That's what gets confusing. Trying to figure out the instances bit (no
>>> pun intended) and if it is needed. Here is the other function that I am
>>> creating to put in my MyFunctions Namespace. I would give is a class of
>>> email, I suppose.
>>>
>>> This is just my prototype email program that I am putting together to
>>> make a more generalized function from.
>>>
>>> It, in essence:
>>> gets the connection to Sql
>>> gets the email record to get the subject and from/to addresses
>>> reads a text file to put into the body of the message
>>> adds a few things to the email
>>> sends the email
>>>
>>> I would probably change the function to something like:
>>>
>>> public shared sendEmail(filename as string, subject as string)
>>>
>>> ***************************************************************************************
>>> sub sendEmail ( )
>>> dim webMasterEmail As String
>>> dim emailSubject As String
>>> Dim mailServer As String
>>> Dim contactEmail As String
>>> Dim screenTestSubject As String
>>>
>>> Dim emailReader As SqlDataReader
>>>
>>> Dim ConnectionString as String
>>> =System.Configuration.ConfigurationSettings.AppSettings("MM_CONNECTION_STRING_solutions")
>>> Dim objConn as New SqlConnection (ConnectionString)
>>> Dim CommandText as String = "Select
>>> MailServer,WebMasterEmail,ContactEmail,ScreenTestSubject from
>>> emailResponse where ClientID = '1234'"
>>> Dim objCmd as New SqlCommand(CommandText,objConn)
>>>
>>> objConn.Open()
>>>
>>> emailReader = objCmd.ExecuteReader
>>>
>>> if emailReader.Read then
>>> mailServer = emailReader("MailServer")
>>> webMasterEmail = emailReader("WebMasterEmail")
>>> contactEmail = emailReader("ContactEmail")
>>> screenTestSubject = emailReader("ScreenTestSubject")
>>> end If
>>>
>>> objConn.close()
>>>
>>> dim URLPath As String = _
>>> Left(request.path, InStrRev(request.path, "/") - 1)
>>>
>>> Dim objStreamReader as StreamReader
>>> Dim strInput As String
>>> Dim strBuffer As String
>>>
>>> If File.exists(MapPath("\new_account_automail.htm")) then
>>> objStreamReader = File.OpenText(MapPath("\new_account_automail.htm"))
>>> strInput = objStreamReader.ReadLine()
>>> while strInput <> nothing
>>> strBuffer = strBuffer & strInput
>>> strInput = objStreamReader.ReadLine()
>>> end while
>>> objStreamReader.Close
>>> end if
>>>
>>> Dim Message As New MailMessage()
>>> message.To = contactEmail
>>> message.From = webMasterEmail
>>> message.Subject = screenTestSubject
>>> message.Body = "This is line 1<br><br>"
>>> message.Body = message.Body & "This is line 2<br><br>"
>>> strInput = strBuffer.replace("#MESSAGE#",message.Body)
>>> strInput = strInput.replace("#MAILTITLE#","Screen Test Confirmation")
>>> message.Body = strInput
>>> message.BodyFormat = MailFormat.Html
>>> SmtpMail.SmtpServer = mailServer
>>> smtpMail.Send(message)
>>> end sub
>>> *****************************************************************************
>>>
>>> Would this work as a shared function, or would I need to make this an
>>> instance?
>>>
>>> Thanks,
>>>
>>> Tom
>>>>
>>>> Karl
>>>>
>>>>
>>>>
>>>> --
>>>> MY ASP.Net tutorials
>>>> http://www.openmymind.net/ - New and Improved (yes, the popup is
>>>> annoying)
>>>> http://www.openmymind.net/faq.aspx - unofficial newsgroup FAQ (more to
>>>> come!)
>>>> "tshad" <tscheiderich@xxxxxxxxxxxxxxx> wrote in message
>>>> news:uBJT31hYFHA.2756@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>I am setting up some of my functions in a class called MyFunctions.
>>>>>
>>>>> I am not clear as to the best time to set a function as Shared and
>>>>> when not to. For example, I have the following bit manipulation
>>>>> routines in my Class:
>>>>>
>>>>> *******************************************************************************
>>>>> imports System
>>>>>
>>>>> NameSpace MyFunctions
>>>>>
>>>>> Public Class BitHandling
>>>>>
>>>>> '*----------------------------------------------------------*
>>>>> '* Name : BitSet *
>>>>> '*----------------------------------------------------------*
>>>>> '* Purpose : Sets a given Bit in Number *
>>>>> '*----------------------------------------------------------*
>>>>> Public Shared Function BitSet(Number As Integer, _
>>>>> ByVal Bit As Integer) As Long
>>>>> If Bit = 31 Then
>>>>> Number = &H80000000 Or Number
>>>>> Else
>>>>> Number = (2 ^ Bit) Or Number
>>>>> End If
>>>>> BitSet = Number
>>>>> End Function
>>>>>
>>>>> '*----------------------------------------------------------*
>>>>> '* Name : BitClear *
>>>>> '*----------------------------------------------------------*
>>>>> '* Purpose : Clears a given Bit in Number *
>>>>> '*----------------------------------------------------------*
>>>>> Public Shared Function BitClear(Number As Integer, _
>>>>> ByVal Bit As Integer) As Long
>>>>> If Bit = 31 Then
>>>>> Number = &H7FFFFFFF And Number
>>>>> Else
>>>>> Number = ((2 ^ Bit) Xor &HFFFFFFFF) And Number
>>>>> End If
>>>>>
>>>>> BitClear = Number
>>>>> End Function
>>>>>
>>>>> '*----------------------------------------------------------*
>>>>> '* Name : BitIsSet *
>>>>> '*----------------------------------------------------------*
>>>>> '* Purpose : Test if bit 0 to bit 31 is set *
>>>>> '*----------------------------------------------------------*
>>>>> Public Shared Function BitIsSet(ByVal Number As Integer, _
>>>>> ByVal Bit As Integer) As Boolean
>>>>> BitIsSet = False
>>>>>
>>>>> If Bit = 31 Then
>>>>> If Number And &H80000000 Then BitIsSet = True
>>>>> Else
>>>>> If Number And (2 ^ Bit) Then BitIsSet = True
>>>>> End If
>>>>> End Function
>>>>>
>>>>> End Class
>>>>>
>>>>> End Namespace
>>>>>
>>>>> ********************************************************************************
>>>>>
>>>>> Now I have these set up as shared so I don't have to create an
>>>>> instance of the class:
>>>>>
>>>>> temp = BitHandling.BitSet(temp,3)
>>>>>
>>>>> vs.
>>>>>
>>>>> dim MyBits as new BitHandling
>>>>> temp = MyBits.BitSet(temp,3)
>>>>>
>>>>> I am also setting up my function to send out various emails which
>>>>> entails reading an Sql Record and reading a text file from disk, as
>>>>> well as sending the email:
>>>>>
>>>>> SmtpMail.SmtpServer = mailServer
>>>>> smtpMail.Send(message)
>>>>>
>>>>> What would tell me that I need to make this a non-shared function vs a
>>>>> shared one?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Tom
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
.
- Follow-Ups:
- Re: Shared functions vs Non-Shared Functions
- From: tshad
- Re: Shared functions vs Non-Shared Functions
- References:
- Shared functions vs Non-Shared Functions
- From: tshad
- Re: Shared functions vs Non-Shared Functions
- From: tshad
- Re: Shared functions vs Non-Shared Functions
- From: tshad
- Shared functions vs Non-Shared Functions
- Prev by Date: Problem viewing uploaded images using ASP.NET
- Next by Date: How to upload an excel file and export into database
- Previous by thread: Re: Shared functions vs Non-Shared Functions
- Next by thread: Re: Shared functions vs Non-Shared Functions
- Index(es):
Relevant Pages
|