понедельник, 29 сентября 2008 г.

О студентах-кодерах и Singleton'е

Сегодня утором, шарясь по необъятным просторам, мать его, интернета, наткнулсо на один очень занимательный исходник, там на  с++ была прога написана с двумя формами, причем они управляют друг-другом, ну не суть, штука в том что в каждой хранится указатель на другую форму, и передается в процедуры через функцию getAnotherFormPointer().
 И так это меня задело, что пострадал я от графоманского приступа, и решил написать это там где никто не прочтет))

  И так Singleton -стандартный шаблон проектирования, позволяет держать в системе только один экземпляр объекта, а при создании еще одного экземпляра возвращается ссылка на уже существующий. Он позволяет резко сократить колличество модификаторов static в коде и упростить жизнь программисту.

Реализация:
 class Singleton
 {
       static Singleton INSTANCE = null;
       static Singleton Instance()
       {
              if(INSTANCE==null)
                      INSTANCE= New Singleton();
              return INSTANCE;
       }
       public Singleton()
       {
               //код конструктора
        }
        // остальной код
 }

Вызов:
Singleton s = Singleton.Instance();
ну или как в C# 3.0:
var s = Singleton.Instance();

  Далее ответ очевиден, реализовать этот шаблон в обеих формах, и без вяских дополнительных ухищрений  получаем доступ к уже существующему объекту, и возможость управлять им и настраивать его так, как если бы создавали его заново.
Если говорить о производительности, то локально возникающая ссылка не повлияет на производительность в той мере в какой повлияет ворох кода передающего ссылки.

воскресенье, 14 сентября 2008 г.

C# играем на console.

Нашел сегодня программку старую, ну точнее она 2006-го года, просто я тогда быле еще новичком в делах программных. Работает не везде(точнее не на всем пищит, на старом компьютере пищало, а на нынешнем нет, хотя сам бипер работоспособный), для запуска нужен .Net Framework 2.0 С сырцами идут файлы - примеры мелодий(*.juk)

P.S. Написана на основе примера из MSDN, сырцы прилагаются.
P.P.S. Мелодии писать тоько по ноте на строку, как в примерах, я тогда не умел строчки парсить.

пятница, 12 сентября 2008 г.

Простой класс для отправки e-mail на C#

Где-то три недели назад попросил меня сокурсник программу ему напасть на практику, в тонкости технического задания углубляться не буду, вобщем одной из функций этой программы должна была стать отправка сообщений по электронной почте, для удобства решил всю логику оформить одним куском:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Net.Mail;
using System.Net;


namespace GAlenAPP.Core.Mailer
{
   public class Mailer
   {
      public Mailer()
      {
      }
      public Mailer(string Login, string Password)
      {
         u_login = Login;
         u_password = Password;
      }


      [DllImport("wininet.dll")]
      static extern bool InternetGetConnectedState(
      ref InternetConnectionState lpdwFlags,
      int dwReserved
      );

      [Flags]
      public enum InternetConnectionState : int
      {
         INTERNET_CONNECTION_MODEM = 0x1,
         INTERNET_CONNECTION_LAN = 0x2,
         INTERNET_CONNECTION_PROXY = 0x4,
         INTERNET_RAS_INSTALLED = 0x10,
         INTERNET_CONNECTION_OFFLINE = 0x20,
         INTERNET_CONNECTION_CONFIGURED = 0x40
      }

      InternetConnectionState flags = 0;
      ///
      /// Проверка состояния интернета
      ///
      public bool CheckInetConnectionStatus()
      {
         return InternetGetConnectedState(ref flags, 0);
      }

      string u_login = "";//имя пользователя
      string u_password = "";//пароль пользователя
      string server = "";//Адрес SMTP сервера с которого отправляем
      string sender_mail = "";//будет выведено в поле адрес отправителя
      string sender_name = "";//будет выведено в поле имя отправителя
      string adresse_mail = "";//адрес получателя
      string subject = "";//тема сообщения
      string body = "";//Текст сообщения
      bool need_user_validation = false;//требуется-ли аутентификация
      bool need_hidden_copy = false;//требуется ли скрытая копия
      string hidden_copy_adresse = "";//адресат получателя скрытой копии
      uint timeout = 2000;//таймаут сервера
      bool needSSL = false;// Требуется ли SSL, google требует, а Yandex нет

     /*Далее идут свойства через которые передают значения в переменные
        описанные выше*/


      public string SenderMail
      {
         get
         {
            return sender_mail;
         }
         set
         {
            sender_mail = value;
         }
      }
      
      public string SenderName
      {
         get
         {
            return sender_name;
         }
         set
         {
            sender_name = value;
         }
      }
      public string AdresseMail
      {
         get
         {
            return adresse_mail;
         }
         set
         {
            adresse_mail = value;
         }
      }
      public string Subject
      {
         get
         {
            return subject;
         }
         set
         {
            subject = value;
         }
      }
      public string Body
      {
         get
         {
            return body;
         }
         set
         {
            body = value;
         }
      }
      public bool NeedUserValidation
      {
         get
         {
            return need_user_validation;
         }
         set
         {
            need_user_validation = value;
         }
      }
      public bool NeedHiddenCopy
      {
         get
         {
            return need_hidden_copy;
         }
         set
         {
            need_hidden_copy = value;
         }
      }
      public uint Timeout
      {
         get
         {
            return timeout;
         }
         set
         {
            timeout = value;
         }
      }
      public string HiddenCopyAdresse
      {
         get
         {
            return hidden_copy_adresse;
         }
         set
         {
            hidden_copy_adresse = value;
         }
      }
      public string SMTPServer
      {
         get
         {
            return server;
         }
         set
         {
            server = value;
         }
      }
      public bool NeedSSL
      {
         get
         {
            return needSSL;
         }
         set
         {
            needSSL = value;
         }
      }
   /* Собственно сама отсылка */
   public bool SendMail()
   {
      var from = new MailAddress(sender_mail, sender_name);
      var to = new MailAddress(adresse_mail);
      var message = new MailMessage(from, to);
      message.Subject = subject;
      message.Body = body;
      if (need_hidden_copy)
      {
         var copy = new MailAddress(hidden_copy_adresse);
         message.CC.Add(copy);
      }

   try
   {
      var client = new SmtpClient(server);
      client.Timeout = (int)timeout;

      if (need_user_validation)
      {
         client.Credentials =
            new System.Net.NetworkCredential(u_login, u_password);
      }

      client.EnableSsl = needSSL;
      client.Send(message); 

      if (SendingCompleted != null)
         SendingCompleted(this, EventArgs.Empty);
      return true;
   }
   catch
   {
      if (SendingFailed != null)
         SendingFailed(this, EventArgs.Empty);
         return false;
   }
}

public event EventHandler SendingCompleted;/*событие вызываемое при успешной отправке*/

public event EventHandler SendingFailed;/* --||--при провале*/
}//Конец класса
}//Конец пространства имен

Если есть какой-нибудь способ забрасывания сюда кода, так чтобы не приходилось делать подсветку вручную, то подскажите пожалуйста, был-бы признателен.