C#
- 101 ответ
- 0 вопросов
135
Вклад в тег
1. Еще несколько раз пройтись по теории, а потом думать, что делать дальше.
3. Выполнять практические задачи.
Лично я предпочитаю 3 вариант, но не знаю, где именно брать эти задачи.
FileInfo f = new FileInfo(@"C:\example.dat");
using (FileStream fs = f.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (BinaryReader br = new BinaryReader(fs))
{
int bytesRead = 0;
byte[] buffer = new byte[256]; // размер буфера 256 единиц байт
StringBuilder result = new StringBuilder();
while ((bytesRead = br.Read(buffer, 0, buffer.Length)) != 0) // читаем не более 256 единиц байт в buffer
{
// из buffer следует извлекать не более bytesRead (в конце это число может быть меньше 255)
}
}
}
public class MyClass
{
public readonly int Value = 0;
public MyClass()
{
this.Value = 123;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Timers;
using System.Threading;
namespace ConsoleApplication20
{
class Program
{
static void Main(string[] args)
{
// создаем экземпляр класса
var t = new Toster(199065);
// выводим значение константы ProjectName
// доступ только через Toster
Console.WriteLine(Toster.ProjectName);
// доступа к локальным константам здесь нет
// Toster.CounterPattern
// t.CounterPattern
// выводим заголовок вопроса
Console.WriteLine(t.Title);
// бесконечность - не предел!
while (true)
{
// t.Id = 123;
// мы не можем поменять идентификатор
// следовательно, этот код, логически, будет работать правильно
// выводим число ответов
Console.WriteLine("Ответов: {0}", t.AnswersCount);
// t.AnswersCount = 123
// мы не можем менять значение readonly свойства,
// но оно может меняться внутри экземпляра класса
// пауза 10 сек.
Thread.Sleep(10000);
}
}
}
public class Toster
{
// публичная константа, доступ через Toster
public const string ProjectName = "Тостер";
// локальная константа, доступна только в рамках этого класса
const string CounterPattern = "<span class=\"section-header__counter\" role=\"answers_counter\">";
// публичные поля только для чтения
// значение может быть установлено в конструкторе
public readonly string Title = "Нет данных";
public readonly int Id = 0;
// свойство только для чтения
// значение может меняться в процессе жизни экземпляра класса
// при помощи локальной переменной
private int _AnswersCount = 0;
public int AnswersCount
{
get
{
return _AnswersCount;
}
}
// это просто таймер
private System.Timers.Timer Timer = null;
// а это конструктор<s>, но не Lego</s>
public Toster(int id)
{
if (id <= 0) { return; }
// получаем вопрос
var web = new WebClient();
web.Encoding = Encoding.UTF8;
var result = web.DownloadString(String.Format("https://toster.ru/q/{0}", id));
// из шаблона url тоже можно сделать константу
// либо в классе можно сделать readonly свойство,
// которое будет на лету формировать итоговый адрес:
// return String.Format("https://toster.ru/q/{0}", this.Id)
// устанавливаем значения для полей
this.Id = id;
this.Title = WebUtility.HtmlDecode
(
result.Substring
(
result.IndexOf("<title>") + "<title>".Length,
result.IndexOf("</title>") - result.IndexOf("<title>") - "<title>".Length
)
);
// выдергиваем число ответов на вопрос
this.ParseAnswersCount(result);
// запускаем периодическую проверку <s>Менделеева</s>
Timer = new System.Timers.Timer(10000);
Timer.Elapsed += Timer_Elapsed;
}
// обработчик истечения интервала времени
private void Timer_Elapsed(object sender, EventArgs e)
{
var web = new WebClient();
web.Encoding = Encoding.UTF8;
var result = web.DownloadString(String.Format("https://toster.ru/q/{0}", this.Id));
this.ParseAnswersCount(result);
}
// выдергиватель количества ответов
private void ParseAnswersCount(string value)
{
int startstart = value.IndexOf("Ответы на вопрос");
int start = value.IndexOf(CounterPattern, startstart) + CounterPattern.Length;
int len = value.IndexOf("</span>", start) - start;
_AnswersCount = Convert.ToInt32(value.Substring(start, len));
}
}
}
[Serializable]
public class MyClass
{
}
// данные, которые будем сериализовать
var data = new List<int> { 1, 2, 3 };
// выполняем сериализацию
// в MemoryStream (можно в любой Stream)
var bf = new BinaryFormatter();
var m = new MemoryStream();
bf.Serialize(m, data);
// курсор потока переводим в начало, т.к. мы работали с потоком выше
// если открывать новый поток, то это делать не обязательно
m.Position = 0;
// выполняем десериализацию данных из MemoryStream
var result = (List<int>)bf.Deserialize(m);
// выводим результат в консоль
result.ForEach(itm => Console.WriteLine(itm));
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
info.AddValue("Ключ", "Значение");
info.AddValue("Ключ2", this.ИмяСвойства);
// и т.д.
}
// конструктор
protected ИмяКласса(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
this.Свойство = info.GetValue("Ключ", typeof(типДанных));
this.ИмяСвойства = (string)info.GetValue("Ключ2", typeof(string));
// и т.д.
}
[Serializable]
public class MyDictionary : Dictionary<string, object>, ISerializable
{
public MyDictionary() { }
protected MyDictionary(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
int count = info.GetInt32("Count"); // получаем число элементов
for (int i = 0; i < count; i++) // перебираем элементы
{
// получаем ключ и значение по индексу элемента
string key = info.GetString(String.Format("ItemKey{0}", i));
object value = info.GetValue(String.Format("ItemValue{0}", i), typeof(object));
// добавляем элемент в себя
this.Add(key, value);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
// перебираем все элементы коллекции
int i = 0;
foreach (KeyValuePair<string, object> item in this)
{
// добавляем отдельно ключ и значение
info.AddValue(String.Format("ItemKey{0}", i), item.Key, typeof(string));
info.AddValue(String.Format("ItemValue{0}", i), item.Value);
i++;
}
// запоминаем, сколько всего элементов
info.AddValue("Count", this.Count);
}
}
// выполняем сериализацию коллекции
var data = new MyDictionary();
data.Add("Key", "Value");
data.Add("Key2", "Value2");
data.Add("Key3", 123);
var bf = new BinaryFormatter();
var m = new MemoryStream();
bf.Serialize(m, data);
// выполняем десериализацию
m.Position = 0;
var result = (MyDictionary)bf.Deserialize(m);
// выводим результат
foreach (var item in result)
{
Console.WriteLine("{0} = {1}", item.Key, item.Value);
}