{{fbdoc item="title" value="SUB (Member)"}}----
Declares or defines a member procedure.

{{fbdoc item="syntax"}}##
	{ [[KeyPgType|Type]] | [[KeyPgClass|Class]] | [[KeyPgUnion|Union]] } //typename//
		[[KeyPgDeclare|declare]] [ [[KeyPgStaticMember|static]] | [[KeyPgConstMember|const]] ] **Sub** //fieldname// [//calling convention specifier//] [ [[KeyPgAlias|alias]] //external_name// ] ( [ //parameters// ] ) [ [[KeyPgStatic|Static]] ] 
	End { [[KeyPgType|Type]] | [[KeyPgClass|Class]] | [[KeyPgUnion|Union]] }
	
	**Sub** //typename//.//fieldname// ( [ //parameters// ] ) [ [[KeyPgExport|Export]] ]
		//statements//
	**End Sub**
##
{{fbdoc item="param"}}
	##//typename//## 
		name of the ##[[KeyPgType|Type]]##, ##[[KeyPgClass|Class]]##, or ##[[KeyPgUnion|Union]]##
	##//fieldname//## 
		name of the procedure
	##//external_name//##
		name of field as seen when externally linked
	##//parameters//## 
		the parameters to be passed to the procedure
	##//calling convention specifier//##	
		can be one of: ##[[KeyPgCdecl|Cdecl]]##, ##[[KeyPgStdcall|Stdcall]]## or ##[[KeyPgPascal|Pascal]]##

{{fbdoc item="desc"}}
	##**Sub**## members are accessed with ##[[KeyPgOpMemberAccess|Operator . (Member access)]]## or ##[[KeyPgOpPtrMemberAccess|Operator -> (Pointer to member access)]]## to call a member procedure and may optionally accept parameters either ##[[KeyPgByval|byval]]## or ##[[KeyPgByref|byref]]##.  ##//typename//## be overloaded  without explicit use of the ##[[KeyPgOverload|Overload]]## keyword.
	
	##//typename//## is the name of the type for which the ##**Sub**## method is declared and defined.  Name resolution for ##//typename//## follows the same rules as procedures when used in a ##[[KeyPgNamespace|Namespace]]##.
	
	A hidden ##[[KeyPgThis|this]]## parameter having the same type as ##//typename//## is passed to non-static member procedures.  ##[[KeyPgThis|this]]## is used to access the fields of the ##[[KeyPgType|Type]]##, ##[[KeyPgClass|Class]]##, or ##[[KeyPgUnion|Union]]##.
	To access duplicated symbols defined outside the Type, add one (or two) dot(s) as prefix: ##.""SomeSymbol""## (or ##..""SomeSymbol""## if inside a [[KeyPgWith|With..End With]] block).
	
	A ##[[KeyPgStaticMember|Static (Member)]]## may be declared using the ##**Static**## specifier.  A ##[[KeyPgConstMember|Const (Member)]]## may be declared using the ##**Const**## specifier.

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/udt/sub.bas"}}%%(freebasic)
type Statistics
  count as single
  sum as single
  declare sub AddValue( byval x as single )
  declare sub ShowResults( )
end type

sub Statistics.AddValue( byval x as single )
  count += 1
  sum += x
end sub

sub Statistics.ShowResults( )
  print "Number of Values = "; count
  print "Average          = ";
  if( count > 0 ) then
	print sum / count
  else
	print "N/A"
  end if
end sub

dim stats as Statistics

stats.AddValue 17.5
stats.AddValue 20.1
stats.AddValue 22.3
stats.AddValue 16.9

stats.ShowResults
%%
**Output:**
%%
Number of Values =  4
Average          =  19.2
%%

{{fbdoc item="lang"}}
	- Only available in the //[[CompilerOptlang|-lang fb]]// dialect.

{{fbdoc item="see"}}
	- ##[[KeyPgClass|Class]]##
	- ##[[KeyPgMemberFunction|Function (Member)]]##
	- ##[[KeyPgSub|Sub]]##
	- ##[[KeyPgType|Type]]##

{{fbdoc item="back" value="CatPgUserDefTypes|User Defined Types"}}