2012-06-23 7 views
5

Qualcuno può dirmi come dichiarare una funzione globale in C#, simile a ciò che fa Module in VB.net? Ho bisogno di chiamare una funzione che può essere chiamata nel mio form1, form2 e form3.come dichiarare la funzione o il metodo globale usando C#?


ho questo codice:

using System.Data.OleDb; 

namespace XYZ 
{ 
    public static class Module 
    { 
     public static void dbConnection() 
     { 
      OleDbConnection con = new OleDbConnection(); 
      con.ConnectionString = "provider= microsoft.jet.oledb.4.0;data source=..\\dbCooperative.mdb"; 
      con.Open(); 
     } 
    } 
} 

e form1:

using System.Data.OleDb; 
using XYZ; 

namespace XYZ 
{ 
    public partial class frmReports : Form 
    { 
     public frm1() 
     { 
      InitializeComponent(); 
     } 

     private void frm1_Load(object sender, EventArgs e) 
     { 
      Module.dbConnection(); 
      OleDbCommand cm = new OleDbCommand("SELECT * FROM table", con); 
     } 
    } 
} 

ma io ha un errore: "Il nome 'con' non esiste nel contesto attuale".

+1

Non ci sono funzioni globali in C#, ma è possibile rendere i metodi accessibili globalmente nella vostra applicazione. – kol

+2

Sebbene siano supportati dal CLR, C# stesso non supporta "Funzioni globali". Per quanto ne so, se vuoi chiamarli, dovresti scrivere quella logica in VB (o in un'altra lingua che li supporta), o modificare te stesso compilato. Nel tuo caso, i suggerimenti per l'uso di una classe statica dovrebbero essere sufficienti. –

risposta

14

È possibile creare una classe statica.

namespace MyNamespace 
{ 
    public static class MyGlobalClass 
    { 
     public static void MyMethod() { ... } 
    } 
} 

Si potrebbe quindi aggiungere lo spazio dei nomi nella sezione using della classe chiamata per accedervi. Come questo:

using MyNamespace; 

public class CallingClass 
{ 
    public void CallingMethod() 
    { 
     MyGlobalClass.MyMethod(); 
    } 
} 
+0

+1 Un'altra opzione è usare un Singleton. – kol

1

È possibile creare una classe statica (anche racchiuderlo in un suo spazio dei nomi in modo da non inquinare il namespace progetto principale), quindi chiamare da qualsiasi luogo:

namespace SomeNamespace 
{ 
    public static class SomeClass 
    { 
     public static string SomeMethod() 
     { 
      ... 
     } 
    } 
} 

Poi, nel codice, si può chiamare usando:

string x = SomeNamespace.SomeClass.SomeMethod(); 

in alternativa, è possibile impostare un using nella parte superiore del codice e basta fare riferimento a esso, senza spazio dei nomi:

using SomeNamespace; 
... 
string x = SomeClass.SomeMethod(); 
+3

Penso che sia seriamente fuorviante chiamare uno spazio dei nomi GlobalNamespace o chiamare una classe GlobalClass ... – kol

+0

@kol forse, ma penso che il salive stia cercando di mostrare in modo anonimo come la classe si riferisce alla sua domanda. –

9

Se si utilizza C# 6.0 o successivo, è possibile utilizzare using static.

Per esempio,

using static ConsoleApplication.Developer; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Global static function, static shorthand really 
      DeveloperIsBorn(firstName: "Foo", lastname: "Bar") 
       .MakesAwesomeApp() 
       .Retires(); 
     } 
    } 
} 

namespace ConsoleApplication 
{ 
    class Developer 
    { 
     public static Developer DeveloperIsBorn(string firstName, string lastname) 
     { 
      return new Developer(); 
     } 

     public Developer MakesAwesomeApp() 
     { 
      return this; 
     } 
     public Developer InsertsRecordsIntoDatabaseForLiving() 
     { 
      return this; 
     } 

     public void Retires() 
     { 
      // Not really 
     }   
    } 
} 

più Un esempio:

using static System.Console; 

namespace ConsoleApplication7 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WriteLine("test"); 
     } 
    } 
} 
+2

Non conoscevo la parola chiave "using static", grazie per averlo menzionato – Simone

1

@kol è giusto, non ci sono funzioni globali in C#. Dai un'occhiata a questo post MSDN post. Vorrei usare strati (ho rinominato la tua classe "Modulo" a "TransactionsModule") e sarebbe simile a questa:

using System; 
using System.Collections.Generic; 
using System.Data.OleDb; 

namespace XYZ 
{ 
    public class TransactionsModule 
    { 
     public List<Person> GetPersons(string query, string connectionString) 
     { 
      List<Person> dbItems = new List<Person>(); 

      OleDbConnection conn = new OleDbConnection(connectionString); 

      try 
      { 
       conn.Open(); 
       var cmd = new OleDbCommand(query, conn); 
       cmd.CommandText = query; 

       using (OleDbDataReader reader = cmd.ExecuteReader()) 
       { 
        Person objPerson = new Person(); 

        //These are the columns returned 
        objPerson.Name = Convert.ToString(myReader["Name"]); 
        objPerson.Age = Convert.ToInt32(myReader["Age"]); 

        dbItems.Add(objPerson); 
       } 
      } 
      catch(OleDbException ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
      return dbItems;   
     } 


    } 

    //This class should be in another Layer, but I placed it here since It's a quick Example 
    public class Person 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 

Tutta la logica è stata estratta alla classe TransactionsModule, allora avete solo bisogno di chiamare il metodo: GetPersons. Date un'occhiata:

using System; 
using System.Collections.Generic; 
using XYZ.TransactionsModule; 

namespace XYZ 
{ 
    public partial class frmReports : Form 
    {  
     public frm1() 
     { 
      InitializeComponent(); 
      protected TransactionsModule moduleTran; 
     } 

     private void frm1_Load(object sender, EventArgs e) 
     { 
      //We initialize the Data Access Layer class 
      moduleTran = new TransactionsModule(); 

      //This ConnectionString should be in your app.config 
      string conString = "provider= microsoft.jet.oledb.4.0;data source=..\\dbCooperative.mdb"; 
      string sqlQuery = "SELECT * FROM table"; 

      List<Person> ItStaff = moduleTran.GetPersons(sqlQuery, conString); 
     } 
    } 
} 
Problemi correlati