Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования C# и платформа .NET [CSharp & .NET] 2001.10.26


Служба Рассылок Subscribe.Ru

C# & .NET

Письма

Тренинги

-----Original Message-----
From: Elena Albitova [mailto:Elena.Albitova@alesta.ru]
Sent: Monday, October 22, 2001 12:32 PM
To: level3@mail.ru
Subject: по поводу рассылки по .NET
Importance: High

Здравствуйте, Сергей!

Я представляю компанию ALESTA Software & Services, которая занимается разработкой ПО, веб-интеграцией, сертифицированным обучением. Подробнее о компании на http://www.alesta.ru .

Входящий в нашу компанию Учебный центр, входящий в нашу компанию, один из первых в России начал проводить курсы по .NET По C# уже прошло несолько курсов, а 19 ноября мы проведем совсем новый курс по Web Services http://www.alesta.ru/020Train/020MOC/00dot/f03_2524.asp

Насколько Вам это интересно?

С наилучшими пожеланиями,
Елена Албитова

Менеджер по маркетингу и PR | mailto:pr@alesta.ru
ICQ UIN 70801425 | тел.(095) 235-7709
ALESTA Software & Services | http://www.alesta.ru

C# - непривычные операторы

Оператор using

Есть такой необычный оператор, который я пропустил, - using.

Этот оператор предназначен для того, чтобы выделить ресурсы, а затем их автоматически освободить.
Пример:

using (R r1 = new R ())
{
    r1.F();
}
что эквивалентно следующему коду:
R r1 = new R();
try
{
    r1.F();
}
finally
{
    if (r1 != null)
    {
        ((IDisposable)r1).Dispose();
    }
}

Здесь класс R должен реализовывать интерфейс IDisposable

interface IDisposable
{
 void Dispose();
}

Можно перечислять ресурсы через запятую:

using (R r1 = new R(), r2 = new R())
{
    r1.F();
    r2.F();
}
или, что тоже самое
using (R r1 = new R())
{
    using (R r2 = new R())
    {
        r1.F();
        r2.F();
    }
}

Иногда бывает удобно заменить имя Dispose на какое-нибудь более подходящие (например "Close"). В этом случае можно сделать Dispose закрытым (private), а метод написать отдельно.

void IDisposable.Dispose ()
{
    Dispose();
}
public void Close ()
{
    freeState();
}

Если захотелось сделать метод Dispose, то возможно используются какие-либо ресурсы OS, поэтому возможно тип должен не уметь маршаллится или быть MarshalByReference.

Оператор Lock

Этот оператор может применяться только к типам-ссылкам (reference types, т.е. настоящим объектам). Если применить, к примеру, для переменной типа "int", то компилироваться не будет.

lock (obj)
{
    ...
}

Это эквивалентно

System.Threading.Monitor.Enter(obj);
try
{
    ...
}
finally
{
    System.Threading.Monitor.Exit(obj);
}

за исключением того, что выражение obj вычисляется один раз, а не два

Для того, чтобы заблокировать статические переменные нужно использовать класс-типа:

lock (typeof (CustomClassName))
{
    ...
}

Checked / Unchecked

пример

checked (expr)
{
    ...
}

unchecked (expr)
{
    ...
}

эти операторы полезны, когда нужно преобразовать больший тип в меньший, например long в int. Если этого сделать нельзя, кидается OverflowException.

Можно их использовать внутри выражения, например

class Test
{
    public const int AllBits = unchecked((int)0xFFFFFFFF);
    public const int HighBit = unchecked((int)0x80000000);
}

C# - функции

Передача параметров

Можно передавать объекты по значению, а можно по ссылке, для этого есть ключевое слово ref

static void Swap(ref int a, ref int b)
{
    int t = a;
    a = b;
    b = t;
}

Если нужно просто вернуть значение из функции, а не изменить существующее значение, то нужно использовать ключевое слово out

static void SolveSquareEquation(
    double a, double b, double c,
    out double x1, out double x2);

Причем соответствующее слово должно ставиться не только в заголовке функции, но и при ее вызове

swap(ref aa, ref bb);

Функции с переменным числом параметров

В стек помещается только массив объектов, а сами объекты размещаются теперь в куче, а не на стеке (в отличии от C++)

Для компилятора указывается ключевое слово params

using System;
class Test
{
    static void F(params int[] args)
    {
        Console.WriteLine("# of arguments: {0}", args.Length);
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine("\targs[{0}] = {1}", i, args[i]);
        }
        static void Main()
        {
            F();
            F(1);
            F(1, 2);
            F(1, 2, 3);
            F(new int[] {1, 2, 3, 4});
        }
    }
}

Управление видимостью

Есть пять типов видимости

  • public
    функции могут вызывать кто угодно
  • protected
    функции могут вызывать только производные классы
  • private
    функции могут вызываться только из этого же класса
  • internal
    функции могут вызываться внутри пространства имен?
  • protected internal
    = protected + internal

то же самое относится ко всему, что находится внутри класса

Функции и наследование

При наследовании можно скрыть функцию, для этого потребуется перед ней написать ключевое слово new. Можно переопределить, использовав ключевое слово override. Но переопределить можно только те функции, которые были объявлены ключевым словом virtual как виртуальные (в отличие от Java, функции в C# по умолчанию невиртуальные)

Свойства

Позволяют скрыть способ получения значения а так же реализовать дополнительную логику.

public string Caption
{
    get
    {
        return ...;
    }
    set
    {
        ... = value;
        ...redraw...
    }
}

Если написать только функцию доступа get, а функцию доступа put пропустить, то свойство будет доступным только для чтения

Индексаторы

Индексаторы позволяют использовать объект так же, как массив.

Например можно сделать "битовый массив" упаковав в байт по восемь бит.

class BitArray
{
    public bool this[int index]
    {
        get
        {
            return ...;
        }
        set
        {
            ... = value;
        }
   }
}

С уважением и наилучшими пожеланиями,
Сергей Радкевич.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное