Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
1

Реализовать Stream.CopyTo() для .NET 3.5

04.03.2016, 18:35. Показов 3339. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В связи с тем, что приходится вести проект на платформе .NET Framework 3.5 возникает необходимость в новых методах, реализующие расширение функциональности системных классов.

Причём подсматривать эту реализацию можно через .NET Reflector в уже реализованных методах на платформе .NET Framework 4.0.

Вот и сейчас при подключении к своей программе специализированной библиотеки для парсинга особым образом кодированной структуры AndroidXml возникает ошибка:

Error CS0103 The name 'CopyTo' does not exist in the current context AndroidXml

Эта ошибка возникает из-за того, что в используемой в моём проекте версии платформы .NET Framrwork 3.5 нет ещё реализации серии методов CopyTo(), которые добавлены в версии .NET Framrwork 4.0.

Эту проблему я думаю решить при помощи самостоятельной реализации этого метода, подсмотрев его реализацию через .NET Reflector в соответствующей библиотеке платформы .NET Framrwork 4.0.

Там он находится в классе Stream пространства имён System.IO из файла mscorlib.dll.

Для реализации этой задачи я создала класс ExtentionMethods, в который я поместила реализацию 2-х методов:

1. Реализацию необходимого мне метода CopyTo()
C#
1
public void CopyTo(Stream destination)
2. Реализацию вспомогательного метода InternalCopyTo(), который вызывается из предыдущего метода.
C#
1
private void InternalCopyTo(Stream destination, int bufferSize)
Полная реализация этих методов, подсмотренная в .NET Reflector выглядит следующим образом.

C#
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Globalization;
 
namespace ExtentionMethods
{
    class ExtentionMethods
    {        
        public void CopyTo(Stream destination)
        {
            if (destination == null)
            {
                throw new ArgumentNullException("destination");
            }
            if (!this.CanRead && !this.CanWrite)
            {
                throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
            }
            if (!destination.CanRead && !destination.CanWrite)
            {
                throw new ObjectDisposedException("destination", Environment.GetResourceString("ObjectDisposed_StreamClosed"));
            }
            if (!this.CanRead)
            {
                throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnreadableStream"));
            }
            if (!destination.CanWrite)
            {
                throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnwritableStream"));
            }
            this.InternalCopyTo(destination, 0x14000);
        }
 
        private void InternalCopyTo(Stream destination, int bufferSize)
        {
            int num;
            byte[] buffer = new byte[bufferSize];
            while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
            {
                destination.Write(buffer, 0, num);
            }
        }
    }
}
При запуске этого программного кода возникает проблема, связанная с тем, что в этих методах в свою очередь вызываются внутренние свойства и методы на экземпляре класса this.

В исходном классе Stream - это было ясно и понятно, но как мне вызывать экземпляр этого класса в моём случае?

Помогите, пожалуйста, мне понять каким образом, нужно изменить программный код (см. выше), чтобы я могла расширить класс Stream методом CopyTo() для платформы .NET Framework 3.5, используя приведенный выше код из версии платформы .NET Framework 4.0.


Заранее благодарю за помощь.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2016, 18:35
Ответы с готовыми решениями:

Реализовать классы Student, Group, Stream, Faculty
HW#3 Реализовать 4 нижестоящих класса и продемонстрировать их работу созданием экземляров данных...

Удалить из Stream-а все вещественные числа, не используя дополнительных Stream-ов
Здравствуйте. Есть следующая задача: В поток записана последовательность целых и вещественных...

stream.read(v,stream.size); //здесь ошибка при исполнении
var stream:Tfilestream; v:variant; begin ...

Ошибка при сохранении xmlDocument в Stream и получение из Stream буфер
Здравствуйте. подскажите пожалуйста в чем проблема. в файл сохраняется отлично, а вот буфер...

13
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.03.2016, 19:00 2
Лучший ответ Сообщение было отмечено InessaSuper как решение

Решение

Цитата Сообщение от InessaSuper Посмотреть сообщение
Помогите, пожалуйста, мне понять каким образом, нужно изменить программный код (см. выше), чтобы я могла расширить класс Stream методом CopyTo() для платформы .NET Framework 3.5, используя приведенный выше код из версии платформы .NET Framework 4.0.
Для этого надо для начала прочитать документацию по реализации extension методов чтобы узнать, что a) методы объявляются в static классе и сами являются static; б) вместо this используется первый аргумент по которому компилятор понимает какой тип мы расширяем. Исходя из этого код можно переписать так:
Кликните здесь для просмотра всего текста
C#
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
26
27
28
29
30
31
32
33
34
35
36
37
static class ExtentionMethods
{        
    public static void CopyTo(this Stream srcStream, Stream destination)
    {
        if (destination == null)
        {
            throw new ArgumentNullException("destination");
        }
        if (!srcStream.CanRead && !srcStream.CanWrite)
        {
            throw new ObjectDisposedException(null); //, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
        }
        if (!destination.CanRead && !destination.CanWrite)
        {
            throw new ObjectDisposedException("destination");//, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
        }
        if (!srcStream.CanRead)
        {
            throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnreadableStream"));
        }
        if (!destination.CanWrite)
        {
            throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnwritableStream"));
        }
        InternalCopyTo(srcStream, destination, 0x14000);
    }
 
    private static void InternalCopyTo(Stream srcStream, Stream destination, int bufferSize)
    {
        int num;
        byte[] buffer = new byte[bufferSize];
        while ((num = srcStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            destination.Write(buffer, 0, num);
        }
    }
}

Я закоментировал обращения к Environment.GetResourceString т.к. это не public метод. Вместо надо можно вставить текст или переписать под свои ресурсы.
3
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
04.03.2016, 20:26  [ТС] 3
При попытке компиляции этого кода у меня в программе возникает предупреждение:

You are debugging a release build.
Using Just My Code with Release builds using compiler optimizations results in degraded debugging experience.

- Stop debugging?
- Disable Just My Code and continue?
- Continue Debugging?
- Continue Debugging (don't ask again)?

Я собираю проект в Release-версии.

Причём тут Continue Debugging?

Реализовать Stream.CopyTo() для .NET 3.5


Я погуглила по поводу этой фичи "Just My Code" и нашла соответствующее описание:

Just My Code
How to: Step Into Just My Code)
Understanding Just My Code

Английским языком я владею в достаточной мере, чтобы понять прочитанное.

Но мне непонятно, что мне отвечать на возникшее предупреждение, показанное на скриншоте (см. ссылку выше)?

И самое главное, чем должен быть обусловлен этот выбор?

Не по теме:

P.S. Скажите, как на этот форуме можно прикреплять скриншоты к сообщениям?

Я перепробовала несколько вариантов вставки скриншотов, но не один не сработал.

Как быть в этом случае?

0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.03.2016, 20:34 4

Не по теме:

Цитата Сообщение от InessaSuper Посмотреть сообщение
Скажите, как на этот форуме можно прикреплять скриншоты к сообщениям?
Нажми иконку со скрепкой, загрузи файл через появившееся окно, закрой его. Затем с помошью выпадающего меню у скрепки вставь ссылку на аттачмент в нужное место сообщения или не вставляй и тогда аттачмент будет показан в конце сообщения.



Добавлено через 1 минуту
Цитата Сообщение от InessaSuper Посмотреть сообщение
При попытке компиляции этого кода у меня в программе возникает предупреждение:
You are debugging a release build.
Похоже ты вносила изменения в код забыв остановить отладку.
1
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
04.03.2016, 20:35 5
Цитата Сообщение от InessaSuper Посмотреть сообщение
При попытке компиляции этого кода у меня в программе возникает предупреждение:
Цитата Сообщение от InessaSuper Посмотреть сообщение
You are debugging a release build.
Что-то тут не сходится. Предупреждение возникает при компиляции или все же при попытке отладки скомпилированного в релизе бинарника?
0
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
04.03.2016, 20:51  [ТС] 6
Я выбрала опцию (см. ниже) в диалоговом окне с предупреждением и больше у меня это сообщение не выводилось.

- Disable Just My Code and continue?

Странность как раз и заключалась в том, что отладку с точками останова на этом проекте я никакую не проводила, а сам проект находится в Release-режиме.

Сейчас я столкнулась с другой трудностью при попытке подключения этого класса ExtentionMethods с расширяющими методами к своему основному проекту.

В CS-файле, где осуществляется вызов созданного на предыдущем этапе расширяющего класс Stream метода CopyTo(), я подключила пространство имён с этим классом через

C#
1
using ExtentionMethods;
Вот метод, в котором я осуществляю вызов расширяющего метода CopyTo()

C#
1
2
3
4
5
6
public byte[] ReadFully()
{
    var buffer = new MemoryStream();
    CopyTo(buffer);
    return buffer.ToArray();
}
Но компилятор на вызове метода CopyTo() по-прежнему выдаёт сообщение с ошибкой:
Error CS0103 The name 'CopyTo' does not exist in the current context AndroidXml
Скажите, что нужно сделать, чтобы компилятор "увидел", что класс Stream расширен методом CopyTo()?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.03.2016, 21:13 7
Цитата Сообщение от InessaSuper Посмотреть сообщение
Я выбрала опцию Disable Just My Code and continue в диалоговом окне с предупреждением и больше у меня это сообщение не выводилось.
Зря. Открой настройки отладчика (Tools -> Options -> Debugger -> Enable just My code) и включи опцию обратно.

Цитата Сообщение от InessaSuper Посмотреть сообщение
Странность как раз и заключалась в том, что отладку с точками останова на этом проекте я никакую не проводила, а сам проект находится в Release-режиме.
Точки останова и конфигурация компиляции здесь ни при чем. Как я уже сказал скорее всего был запущен отладчик через F10 или F11 для которых точки останова не нужны.

Цитата Сообщение от InessaSuper Посмотреть сообщение
C#
1
2
3
4
5
6
public byte[] ReadFully()
{
    var buffer = new MemoryStream();
    CopyTo(buffer);
    return buffer.ToArray();
}
Но компилятор на вызове метода CopyTo() по-прежнему выдаёт сообщение с ошибкой:
Error CS0103 The name 'CopyTo' does not exist in the current context AndroidXml
Расширяющий метод нужно вызывать на экземпляре того типа который он расширяет. В данном случае таким типом является Stream. Ты вызываешь CopyTo() как метод своего класса. Это бы прошло успешно только если бы текущий класс являлся наследником Stream. Как исправить ошибку по приведенному коду понять нельзя т.к. внутри ReadFully есть только один поток.
1
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
04.03.2016, 21:46  [ТС] 8
Я работаю с кодами библиотеки "Android XML parser for .NET", которую я интегрирую в свою программу.

Библиотека "Android XML parser for .NET" использует для работы платформу .NET Framework 4.0, а код моей программы для совместимости с другими используемыми библиотеками должен использовать .NET Framework 3.5.

Коды библиотеки находятся в свободном доступе и выложены в соответствующем разделе на CodePlex: Android XML parser for .NET

В файле BoundedStream.cs в самом последнем методе и вызывается используемый мной расширяющий метод CopyTo().

Сейчас по контексту кода библиотеки "Android XML parser for .NET" можно понять каким образом нужно правильно вызвать метод CopyTo()?
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
04.03.2016, 22:06 9
По идее должно компилироваться без ошибок, т.к. BoundedStream наследник Stream. Может класс с методами расширения сделать public?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.03.2016, 22:07 10
InessaSuper, класс BoundedStream является наследником Stream и следовательно вызов CopyTo в приведенном выше коде должен работать. Раз он не работает, то или компилятор не видит расширяющий метод или в проекте есть другой класс Stream и путаница возникает из-за него.
0
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
05.03.2016, 02:07  [ТС] 11
Для того, чтобы успешно скомпилировать библиотеку "Android XML parser for .NET" оказалось, что перед вызовом метода CopyTo() необходимо было поставить this.

C#
1
this.CopyTo(buffer);
После того, как я успешно собрала эту библиотеку в файл AndroidXml.dll у меня возникла ошибка при подключении её к коду своего приложения.

Ошибка:
TypeLoadException: A type load exception has occurred.


Моё приложение представляет собой проект в Unity3D, к которому я подключаю эту библиотеку, чтобы осуществить программный парсинг xml-файла, который хранится в apk-файле в закодированном виде.

Мне необходимо осуществлять парсинг этого xml-файла программным образом во время выполнения моего Unity3D-приложения при помощи вызова методов из скомпилированной на предыдущем этапе библиотеки AndroidXml.dll.

Но при перетаскивании скомпилированной библиотеки AndroidXml.dll в мой Unity3D-проект в консоли вывода сообщений компилятора появляется сообщение с ошибкой:

Ошибка:
TypeLoadException: A type load exception has occurred.


Скажите, пожалуйста, что может быть с моей скомпилированной библиотекой AndroidXml.dll, что возникает подобного рода ошибка?

Изначально я пыталась подключить оригинальную версию библиотекой AndroidXml.dll, которая была собрана для версии .NET Framework 4.0.

В этом случае в Unity-консоли возникала следующая ошибка при подключении этой библиотеки.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)
  at System.Reflection.Assembly.GetTypes () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.ComputeNamespaces (System.Reflection.Assembly assembly, System.Type extensionType) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.ComputeNamespace (Mono.CSharp.CompilerContext ctx, System.Type extensionType) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.GlobalRootNamespace.ComputeNamespaces (Mono.CSharp.CompilerContext ctx) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.LoadReferences () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0 
 
Missing method .ctor in assembly E:\Users\Unity3D\Parsing\Assets\Plugins\AndroidXml.dll, type System.Runtime.Versioning.TargetFrameworkAttribute
The class System.Runtime.Versioning.TargetFrameworkAttribute could not be loaded, used in AndroidXml
Can't find custom attr constructor image: E:\Users\Unity3D\Parsing\Assets\Plugins\AndroidXml.dll mtoken: 0x0a00000e
Поэтому я залезла в интернет и нашла решение подобной проблемы в теме (см. ссылку ниже), где люди рекомендуют использовать .NET Framework 3.5, чтобы DLL-библиотека успешно подключилась к Unity3D-приложению.

Including a DLL in unity?

Сейчас я собрала библиотеку AndroidXml.dll для платформы .NET Framework 3.5 и возникает ошибка: AndroidXml.dll.zip

Ошибка:
TypeLoadException: A type load exception has occurred.


Вот ссылка на файл с собранной мной библиотекой под платформу .NET Framework 3.5:

Скажите, пожалуйста, что может быть с моей скомпилированной библиотекой AndroidXml.dll, что возникает подобного рода ошибка при попытке её "разбора" C#-компилятором в Unity?

Добавлено через 3 часа 10 минут
После того, как я сделала класс с методами расширения public, как советовал Someone007, у меня всё заработало.

Теперь у меня получившаяся библиотека AndroidXml.dll нормально загружается в Unity, и классы из этой библиотеки стали доступны внутри моего скрипта Operation.cs в Unity.

Я только не могу понять как в моём случае подавать на входе в конструктор класса AndroidXmlReader параметр stream?

В исходной документации приведены 2 строчки с примеров загрузки декодированного с помощью класса AndroidXmlReader документа XDocument для дальнейшей его обработки стандартными средствами парсинга XML-содержимого:

C#
1
2
var reader = new AndroidXmlReader(stream);
XDocument doc = XDocument.Load(reader);
Насколько я понимаю, мне нужно вычитывать значение содержимого файла AndroidManifest.xml из apk-сборки в виде массива байтов вместо чтения этого содержимого в виде строки как я делала при чтении содержимого файла AndroidManifest.xml в редакторе Unity?

В своём скрипте Operation.cs в Unity я использую следующий код для чтения содержимого файла AndroidManifest.xml:

C#
1
2
3
4
5
6
7
8
9
string fileContent; // Содержимое файла AndroidManifest.xml (в виде строки)
byte[] fileContentBytes; // Содержимое файла AndroidManifest.xml (в виде массива байтов)
// Чтение содержимого файла AndroidManifest.xml
using (WWW www = new WWW(filePath + "AndroidManifest.xml"))
{
    yield return www;
    fileContent = www.text;
    fileContentBytes = www.bytes;
}
При чтении в редакторе Unity мне нужно парсить содержимое файла в виде строки, а в ином случае (чтение из apk-файла) мне нужно читать данные в виде байтового массива.

Теперь я предполагаю читать содержимое бинарного файла следующим образом:

C#
1
2
3
4
5
6
#if UNITY_EDITOR
XDocument doc = XDocument.Parse(fileContent);
#else
var reader = new AndroidXmlReader(fileContentBytes);
XDocument doc = XDocument.Load(reader);
#endif
У меня в этом коде возникает ошибка в связи с тем, что я использую вызов AndroidXmlReader(fileContentBytes), а нужно передавать конструктору параметр в виде потока stream.

Скажите, пожалуйста, как мне сформировать этот поток stream из имеющегося у меня байтового массива, в котором закодирован XML-формат в apk-файле под Android?
1
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.03.2016, 10:00 12
Цитата Сообщение от InessaSuper Посмотреть сообщение
Скажите, пожалуйста, как мне сформировать этот поток stream из имеющегося у меня байтового массива, в котором закодирован XML-формат в apk-файле под Android?
C#
1
Stream stream = new MemoryStream(byteArray);
2
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
05.03.2016, 13:30  [ТС] 13
Мне удалось запустить, наконец, тестовый вариант проекта в Visual Studio с использованием последнего совета.

Подключенная DLL-библиотека AndroidXml.dll отлично проводить дешифровку зашифрованного файла AndroidManifest_encoded.xml, который я извлекла из apk-сборки.

Потом я подключила эту DLL-библиотеку к своему проекту в Unity.

Когда я запускаю Unity-проект на выполнение в самом редакторе Unity, то чтение и парсинг XML-данных из зашифрованного файла AndroidManifest_encoded.xml происходит корректно.

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

System.TypeLoadException: Could not load type `System.IO.InvalidDataException` from assembly `AndroidXML` at AndroidXML.Res.ResXMLParser+<ParserIterator>d__60.MoveNext () [0x0000] in <filename unknown>

Для уверенности я проверила, что из файла AndroidManifest_encoded.xml вычитывается корректная байтовая последовательность, которая идентична той байтовой последовательности, которая при запуске на десктопе дешифруется и парсится без всяких проблем.

Таким образом, получается, что один и тот же алгоритм DLL-библиотеки AndroidXml.dll ведёт себя по разному на десктопной и мобильной версиях приложения.

Вот ссылка на файл ResXMLParser.cs в котором возникает ошибка-исключение, выложенный на ресурсе CodePlex.

Тут можно посмотреть содержимое соответствующего ему программного кода.

http://androidxmldotnet.codepl... LParser.cs

Скажите, что может вызывать возникновение этого исключения при запуске приложения на мобильной платформе?

Я не могу понять почему в возникающей ошибке идёт речь о каком-то <filename unknown>, когда я использую на входе в парсер-дешифратор AndroidXML предварительно вычитанный байтовый массив byte[] fileContentBytes?

C#
1
2
3
Stream stream = new MemoryStream(fileContentBytes);
var reader = new AndroidXmlReader(stream);
XDocument doc = XDocument.Load(reader);
Как можно исправить возникающую ошибку?

Добавлено через 51 минуту
Вот ссылка на последнюю используемую версию DLL-библиотеки AndroidXML.dll: AndroidXml.dll.zip

Для того, чтобы было более понятно о каком идентификаторе d__60 идёт речь в коде ошибки возникающим исключением я взяла файл AndroidXML.dll и декодировала его с помощью .NET Reflector.

Вот листинг с декодированным кодом файла ResXMLParser.cs, в котором возникает ошибка:

System.TypeLoadException: Could not load type `System.IO.InvalidDataException` from assembly `AndroidXML` at AndroidXML.Res.ResXMLParser+<ParserIterator>d__60.MoveNext () [0x0000] in <filename unknown>

Я понимаю, что исключение InvalidDataException возникает, когда поток данных имеет недопустимый формат.

Но как понять о каком потоке данных идёт речь в данном случае?

Как я уже говорила, байтовые массивы с используемыми в приложении для дешифровки и парсинга данные идентичны для мобильной и десктопной платформ.

Почему этот поток имеет правильный формат на десктопной платформе и ошибочный формат на мобильной платформе?
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 1
06.03.2016, 14:15 14
Нужно получить как-то более детальную отладочную информацию.
Может быть кто-то на форуме подскажет как это можно сделать...
0
06.03.2016, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2016, 14:15
Помогаю со студенческими работами здесь

Как создать картинки используя bitmap.Save(Stream stream, .)
Я сохраняю все картинки так: output = bmp; output.Save($&quot;Img{Convert.ToString(i)}.png&quot;); Это в...

Не получается скопировать из одного Stream в другой Stream
procedure TSaveBase.Save; var DrvFileList : TStringList; ...

CopyTo
Здравствуйте, у меня такая проблема возникла, не могу разобраться как скопировать под строку, в...

Почему в CopyTo такая формула?
CopyTo: public void CopyTo(T array, int arrayIndex) { if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru