Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Создание небезопасного кода в среде .NET. Включение и выключение ошибок переполнения.

Читайте также:
  1. II. Работа над созданием собственного текста.
  2. II. Создание и продвижение личного блога в ЖЖ
  3. V2:Профилактика девиантного поведения в молодежной среде. Социально-педагогическая работа с неформальными молодежными группами и объединениями
  4. Агрессия против СССР, создание антигитлеровской коалиции.
  5. Акционеpные общества, создание, pеоганизация, ликвидация
  6. Анализ ошибок воспроизведения
  7. АРХАИЧЕСКИЙ ЕГИПЕТ. СОЗДАНИЕ ЦЕНТРАЛИЗОВАННОГО ГОСУДАРСТВА.
  8. Асинхронные операции в среде .NET. Асинхронный вызов делегатов.
  9. В какой последовательности стадий представляется жизненный цикл объекта (1-рождение, 2-описание, 3-создание, 4-функционирование, 5-переработка, 6-ликвидация).
  10. В) оценка эффективности действий, причин ошибок и осложнений

Небезопасный код - код, выделение и освобождение памяти для которого не контролируется исполняющей средой.NET. Небезопасный код дает особенно заметные преимущества при использовании указателей для взаимодействия с унаследованным кодом (таким как API для С) или когда вашему приложению требуется прямое манипулирование памятью (как правило, из соображений повышения производительности).

Вы можете писать небезопасный код, применяя ключевые слова unsafe и fixed. Первое указывает, что помеченный им блок будет работать в неуправляемом контексте. Его можно применять ко всем методам, включая конструкторы и свойства, и даже к блокам кода внутри методов. Второе отвечает за фиксацию (pinning) управляемых объектов. Фиксация налагает запрет на перемещение данного объекта сборщиком мусора (GC). По мере исполнения приложения выделенная под объекты память освобождается, в итоге остаются "фрагменты" свободной памяти. Чтобы не допустить фрагментации памяти, исполняющая среда.NET перемещает объекты, обеспечивая максимально эффективное использование памяти. Что хорошего в том, что при наличии указателя на конкретный адрес в памяти,.NET сдвинет находившийся по этому адресу объект без вашего ведома, оставив вас с неверным указателем! Поскольку GC перемещает объекты в памяти, чтобы увеличить эффективность работы приложения, будьте благоразумны, используя fixed.

Операторы C# могут выполняться в проверяемом или непроверяемом контексте. В проверяемом контексте арифметическое переполнение вызовет исключение. В непроверяемом контексте арифметическое переполнение будет проигнорировано, а результат усечен.

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

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

Если не указано ни checked, ни unchecked, контекст по умолчанию зависит от внешних факторов, например параметров компилятора.


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.IO;

namespace CustomThreadPool

{

public delegate void TaskDelegate();

public class TaskQueue

{

public TaskQueue(int threadCount)

{

tasks = new Queue<TaskDelegate>();

threads = new List<Thread>();

for (int i = 0; i < threadCount; i++)

{

var t = new Thread(DoThreadWork);

threads.Add(t);

t.IsBackground = true;

t.Start();

}

}

public int ThreadCount

{

get { return threads.Count; }

}

public void EnqueueTask(TaskDelegate task) {

lock (tasks)

{

tasks.Enqueue(task);

Monitor.Pulse(tasks);

}

}

private TaskDelegate DequeueTask()

{

lock (tasks)

{

while (tasks.Count == 0)

Monitor.Wait(tasks);

TaskDelegate t = tasks.Dequeue();

return t;

}

}

private void DoThreadWork()

{

while (true)

{

var task = DequeueTask();

try

{

task();

}

catch (ThreadAbortException)

{

Thread.ResetAbort();

}

catch (Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

}

private List<Thread> threads;

private Queue<TaskDelegate> tasks;

}

 

class Program

{

static int TaskCount = 0;

static void TestTask()

{

try

{

var taskNumber = Interlocked.Increment(ref TaskCount);

WriteTaskNumber(taskNumber);

 

Thread.CurrentThread.Abort();

}

catch (Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

 

static void WriteTaskNumber(int taskNumber)

{

for (int i = 0; i < 10000; ++i)

Console.Write(" {0} ", taskNumber);

}

 

static void Main(string[] args)

{

var taskQueue = new TaskQueue(3);

for (int i = 0; i < 10; i++)

taskQueue.EnqueueTask(TestTask);

Console.ReadLine();

}

}

}

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Threading;

using System.Runtime.InteropServices;

 

namespace DisposePattern

{

public class LogFile: Object, IDisposable

{

public LogFile(string filePath)

{

stream = new FileStream(filePath, FileMode.Append,

FileAccess.Write, FileShare.None);

}

public void Dispose()

{

if (!disposed)

{

stream.Close();

disposed = true;

}

}

public void Write(string str)

{

if (disposed)

throw new ObjectDisposedException(this.ToString());\

using (var writer = new StreamWriter(stream))

writer.Write(str);

}

private FileStream stream;

private bool disposed;

}

public class OSHandle: Object, IDisposable

{

public OSHandle()

{

}

public OSHandle(IntPtr handle)

{

this.handle = handle;

}

 

~OSHandle()

{

DoDispose(false);

}

 

public IntPtr Handle

{

get

{

if (!disposed)

return handle;

else

throw new ObjectDisposedException(ToString());

}

set

{

if (!disposed)

handle = value;

else

throw new ObjectDisposedException(ToString());

}

}

 

public void Dispose()

{

if (!disposed)

{

DoDispose(true);

GC.SuppressFinalize(this);

disposed = true;

}

}

 

protected virtual void DoDispose(bool disposing)

{

if (handle!= IntPtr.Zero)

CloseHandle(handle);

if (disposing)

{

// Вызван из Dispose

}

else

{

// Вызван из Finalize

}

}

 

[DllImport("kernel32")]

private static extern bool CloseHandle(IntPtr handle);

 

private IntPtr handle;

private bool disposed;

}

 

 

class Program

{

static void TestLogFile()

{

LogFile f = new LogFile(@"D:\MyTestLog.txt");

try

{

f.Write("Привет!");

f.Write("Пока!");

}

finally

{

f.Dispose();

}

f.Write("Еще раз привет!");

}

 

static void Main(string[] args)

{

try

{

OSHandle h = new OSHandle();

h.Dispose();

IntPtr p = h.Handle;

}

catch (Exception ex)

{

Console.WriteLine(ex);

}

Console.ReadLine();

}

}

}

 




Дата добавления: 2015-01-30; просмотров: 42 | Поможем написать вашу работу | Нарушение авторских прав

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | <== 25 ==> |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.017 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав