Я сейчас что-то кодирую, и передаю строку конструктору. Способ, которым генерируется строка, никоим образом не изменяется, но он (когда я запускаю инструменты отладки в Visual Studio Community) теряет значение в первый раз, но показывает значение в большинстве других случаев. С перерывами значение сообщает, что строка имеет значение NULL или значение, которое оно должно быть.Потеря значения аргумента
Теперь я действительно не знаю, как точно документировать, что я делаю, поэтому вот основные сведения.
Первая часть - определение TempDir. Я использую эти временные каталоги в качестве тестовых каталогов, которые автоматически убивают себя и удаляют содержимое, когда TempDir (и тест) выходит из области видимости.
FINAL, РАБОЧИЙ, NO-обесценились версия
public class TempDir : IDisposable
{
private readonly string _path;
public string ActiveDirectory => _path.Substring(_path.LastIndexOf('/') + 1, (_path.Length - _path.LastIndexOf('/') - 1));
public string Path
{
get
{
return _path;
}
}
public TempDir(string path) : this(path, false) { }
public TempDir(string path, bool KillExisting)
{
_path = path;
if(!KillExisting)
return;
if(Directory.Exists(_path))
Directory.Delete(_path);
}
public void Dispose()
{
if(System.IO.Directory.Exists(_path))
Directory.Delete(_path, true);
}
public static implicit operator String(TempDir dir) => dir._path;
}
Теперь, это код, который я посылаю к конструктору. ActiveDirectory TempDir отправляется в конструктор, где NameOfThing должен быть результатом первого аргумента, а второй аргумент также является строкой. Первый работает с перерывами, второй всегда работает.
TempDir dir = new TempDir(Environment.GetFolderPath(Environment.SpecialFolders.LocalApplicationData) + "/First/Second/NameOfThing")
Я серьезно так потерял на этом, и от того, что я могу сказать, я думаю, что поток может быть что-то на меня меняется без моего ведома
EDIT:
Теперь я могу «надежно» заставить его проходить каждый раз, но мне приходится медленно проходить через каждую строку кода. Запуск его обычно без отладки через каждую строку терпит неудачу каждый раз, но отладка медленно заставляет ее проходить каждый раз.
Код построения TEMPDIR:
protected static string PackagesLocation = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "/Sloth/Notes/";
protected static TempDir TestPackLoc = new TempDir(PackagesLocation + "NPackageTests");
protected static NPackage TestPack = new NPackage(TestPackLoc.ActiveDirectory);
Метод испытания создания страницы
[TestMethod]
public void GeneratesLayoutAndResourcesDirectory()
{
string key = "GeneratesLayoutAndResourcesDictionary";
TestPack.CreatePage(key);
if(!Directory.Exists(TestPackLoc + "/" + key + "/res") && !Directory.Exists(TestPackLoc + "/" + key + "/layout.xml"))
Assert.Fail();
}
Итак, поведение утраченной ценности было, я думаю, потому что C# звала сборщик мусора некстати. @mason упомянул, что для типа TempDir вместо реализации деструктора я должен реализовать IDisposable. Теперь он работает надежно и последовательно. Я понятия не имею, почему реализация деструктора сделала это, но замена его на IDisposable работает просто отлично.
Кредит на решение идет в @mason
Где находится NPage? Очевидно, что передача нулевого значения –
требует более уместного кода, скриншотов недостаточно. – Fredou
Необходим еще * соответствующий код –