Моя программа использует BackgroundWorker для вызова метода PerformAction()
, когда другой метод, Method1
возвращает true. Я также использую Strategy Pattern для установки правильного PerformAction()
, который должен выполняться каждый раз при поднятии события.String.Substring (начало, конец) иногда бросает исключение
Для шаблона стратегии я создал абстрактный класс, а затем класс внутри абстрактного класса, который наследует его.
Public MustInherit Class Abstract
Public MustOverride Sub PerformAction(ByVal str as String)
Public Class Extends
Inherits Abstract
Public Overrides Sub PerformAction(ByVal str as String)
str = str.Substring(str.IndexOf(":"), str.IndexOf(">"))
MsgBox(str)
End Sub
End Class
Я создаю еще один класс, который содержит поле Abstract, и используется для вызова PerformAction.
Метод PerformAction вызывается из события BackgroundWorker.ReportProgress, которое вызывается, когда BackgroundWorker.DoWork обнаруживает, что Method1
возвращает true. И с кодом выше, он вызывает System.Reflection.TargetInvocationException
с информацией о добавлении Исключение было выбрано целью вызова.
отладчик говорит мне:
this Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Delegate
args Cannot obtain value of local or argument 'args' as it is not available at this instruction pointer, possibly because it has been optimized away. object[]
Как ни странно, когда я выполняю (что мне кажется) идентичную операцию с двумя подстрок:
s = s.Substring(s.IndexOf(":"))
s = s.Substring(0, s.IndexOf(">"))
она функционирует отлично.
В чем разница между этими двумя методами? Неправильно ли установлено мое наследование, и что вызывает эти ошибки? Что тут происходит?
Дайте мне знать, если мне нужно добавить код, чтобы объяснить ситуацию. Благодарю.
Второй аргумент в методе 'SubString' - это длина ** подстроки **, а не индекс последнего символа. – Blackwood
Что-то вроде 's.Substring (s.IndexOf (": "), s.IndexOf ("> ") - s.IndexOf (": "))' или, конечно, назначить 's.IndexOf (": ")' к переменной и использовать это ... – Thraka